【问题标题】:jQuery .addClass applying to everythingjQuery .addClass 适用于一切
【发布时间】:2022-01-20 13:50:14
【问题描述】:

我有一个使用 jQuery 的点赞按钮。点赞按钮按预期工作,但是由于我设置它的方式,它会将页面上的每个图标更改为心脏

代码:

if (data.liked) {
    updateText(this_, data.likescount, "")
    $(".like-btn").prepend("<i></i>");
    $("i").addClass("fa fa-heart-o liked-heart");  //problem line
} else {
    updateText(this_, data.likescount, "")
    $(".like-btn").prepend("<i></i>");
    $("i").addClass("fa fa-heart-o unliked-heart"); //problem line

从我用户的角度来看,问题是我将fa fa-heart-o ... 类附加到所有i 元素。我怎样才能把它应用到like按钮上

完整代码:

<script>
    $(document).ready(function(){
         function updateText(btn, newCount, verb){
         btn.text(newCount + " " + verb)
     }

     $(".like-btn").click(function(e){
       e.preventDefault()
       var this_ = $(this)
       var likeUrl = this_.attr("data-href")
       var likeCount = parseInt(this_.attr("data-likes")) | 0
       var addLike = likeCount + 1
       var removeLike = likeCount - 1
       if (likeUrl){
          $.ajax({
           url: likeUrl,
           method: "GET",
           data: {},
           success: function(data){
             console.log(data)
             var newLikes;
             if (data.liked){
                  updateText(this_, data.likescount, "")
                  $(".like-btn").prepend("<i></i>");
                  $( "i" ).addClass( "fa fa-heart-o liked-heart" );
              } else {
                  updateText(this_, data.likescount, "")
                  $(".like-btn").prepend("<i></i>");   
                  $( "i" ).addClass( "fa fa-heart-o unliked-heart" );    

              }
           }, error: function(error){
             console.log(error)
             console.log("error")
           }
         })
       }       
     })
 })
</script> 

<a class="like-btn" data-href='{{ post.get_api_like_url }}' data-likes="{{ post.likes.count }}" href="{{ post.get_like_url }}"><i class="{% if userliked %}fa fa-heart-o liked-heart{% else %}fa fa-heart-o unliked-heart{% endif %}" aria-hidden="true"></i>{{ post.likes.count }}</a>

更新:图标更新和文本更新都单独工作。但是,当我将它们放在一起时,当我单击点赞按钮时,它会更新点赞号码但会删除图标

<script>
    $(document).ready(function(){
            function updateText(btn, newCount, verb){
            btn.text(newCount + " " + verb)
        }

    $(".like-btn").click(function(e) {
    e.preventDefault()
    let this_ = $(this)
    var likeUrl = this_.attr("data-href")
    var likeCount = parseInt(this_.attr("data-likes")) | 0
    var addLike = likeCount + 1
    var removeLike = likeCount - 1
    if (likeUrl){
          $.ajax({
           url: likeUrl,
           method: "GET",
           data: {},
           success: function(data){
             console.log(data)
             var newLikes;
                 let is_liked = this_.find('i').hasClass('fa-heart');
                 if (is_liked){
                  this_.find('i').removeClass('fa-heart').addClass('fa-heart-o');
                  updateText(this_, data.likescount, "")
                  
              } else {
                  this_.find('i').removeClass('fa-heart-o').addClass('fa-heart');
                  updateText(this_, data.likescount, "")
              }
           }, error: function(error){
             console.log(error)
             console.log("error")
           }
         })
       }       
     })
 })
    
</script>

最终工作代码:

<script>
    $(document).ready(function(){
            function updateText(btn, newCount, verb){
            btn.text(newCount + " " + verb)
        }

    $(".like-btn").click(function(e) {
    e.preventDefault()
    let this_ = $(this)
    var likeUrl = this_.attr("data-href")
    var likeCount = parseInt(this_.attr("data-likes")) | 0
    var addLike = likeCount + 1
    var removeLike = likeCount - 1
    
    if (likeUrl){
          $.ajax({
           url: likeUrl,
           method: "GET",
           data: {},
           success: function(data){
             console.log(data)
             var newLikes;
                 let is_liked = this_.find('i').hasClass('fa fa-heart liked-heart');
                 let cur_likes = +this_.find('span').text()
                 if (is_liked){
                    this_.find('i').removeClass('fa fa-heart liked-heart').addClass('fa fa-heart-o unliked-heart');
                        this_.find('span').text(cur_likes-1);
                  
              } else {
                this_.find('i').removeClass('fa fa-heart-o unliked-heart').addClass('fa fa-heart liked-heart');
                    this_.find('span').text(cur_likes+1);
              }
           }, error: function(error){
             console.log(error)
             console.log("error")
           }
         })
       }       
     })
 })
            <a class="like-btn" data-href='{{ post.get_api_like_url }}' data-likes="{{ post.likes.count }}" href="{{ post.get_like_url }}"><i class="{% if userliked %}fa fa-heart liked-heart{% else %}fa fa-heart-o unliked-heart{% endif %}" aria-hidden="true"></i> <span>{{ post.likes.count }}</span></a>

【问题讨论】:

    标签: javascript jquery django


    【解决方案1】:

    当你点击.like-btn时,它包含i标签,你为什么要在success中再次尝试$(".like-btn").prepend("&lt;i&gt;&lt;/i&gt;");?由于您已将$(this) 存储在this_ 变量中,您可以通过this_.find('i') 和成功方法轻松获取目标i,然后尝试从选定的i 添加或删除类。

    【讨论】:

      【解决方案2】:

      您目前正在定位页面上的每个“.like-btn”,并且还定位到每个 &lt;i&gt;。正如另一个答案中提到的,您可以使用 jQuery 的 .find(selector) 来定位现有的 &lt;i&gt; 标记(而不是预先添加它)并使用 removeClass/addClass 组合简化您的代码

      $(document).ready(function() {
      
          $(".like-btn").click(function(e) {
            e.preventDefault()
            let this_ = $(this)
            let is_liked = this_.find('i').hasClass('fa-heart');
            let cur_likes = +this_.find('span').text()
            if (is_liked) {
              this_.find('i').removeClass('fa-heart').addClass('fa-heart-o');
              this_.find('span').text(cur_likes-1);
            } else {
              this_.find('i').removeClass('fa-heart-o').addClass('fa-heart');
                this_.find('span').text(cur_likes+1);
         }
          })
        })
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css" integrity="sha512-5A8nwdMOWrSz20fDsjczgUidUBR8liPYU+WymTZP1lmY9G6Oc7HlZv156XqnsgNUzTyMefFTcsFH/tnJE/+xBg==" crossorigin="anonymous" referrerpolicy="no-referrer"
      />
      
      <a class="like-btn" href="javascript:void(0)"><i class="fa fa-heart-o "></i> <span>5</span></a>
      <a class="like-btn" href="javascript:void(0)"><i class="fa fa-heart-o"></i> <span>9</span></a>
      <a class="like-btn" href="javascript:void(0)"><i class="fa fa-heart-o"></i> <span>12</span></a>

      【讨论】:

      • 感谢您的回复!我得到了单独工作的图标更新和文本更新。但是,当我将它们放在一起时,当我单击点赞按钮时,它会更新点赞数,但会删除图标。你能看一下新代码sn-p吗?再次感谢
      • 我稍微修改了 html 以在 &lt;span&gt; 标记中将该数字分开并更新了我的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 2012-01-15
      • 1970-01-01
      • 2012-01-13
      相关资源
      最近更新 更多