2011-08-16 52 views
0

昨天我在这段代码发现了潜在的错误使用jQuery:可能jQuery的错误 - 事件仍然被改变的类元素上触发

$(document).ready(function() { 

    $('.likedLink').click(function(){ 
     return false; 
    }); 


    $('.likes').click(function(){ 

     var id = $(this).attr('id'); 
     var currentLike = id; 
     id = id.replace('p',''); 


     $.ajax({ 
      type: "POST", 
      url: "/posts/like", 
      data: "id=" + id, 
      success: function(like){ 
       $('#' + currentLike).html(like).removeClass('likes').addClass('likedLink'); 
      } 
     }); 


     return false; 

    }); 

}); 

的后收到多少回,并将当前点击链接的HTML来新的价值。然后我改变元素上的类以避免进一步点击/ AJAX。

现在,代码工作,它收到新的HTML,甚至正确地改变了类,但AJAX事件仍然被解雇,当用户/我点击它,但它是一个不同的类,所以它不应该被解雇!

任何想法,或者这是一个与jQuery的错误?

顺便说一句,我通过改变.html().replaceWith("<p>" + like + "</p>")固定代码,但我很好奇这是怎么发生的

回答

2

这不是一个错误!

您的选择器仅在您创建时进行评估。稍后更改班级名称不会取消绑定该事件。

你必须解除绑定:

$.ajax({ 
    type: "POST", 
    url: "/posts/like", 
    data: "id=" + id, 
    success: function(like){ 
     $('#' + currentLike).html(like).unbind('click'); 
    } 
}); 

无需甚至改变类的名称。

+0

+1。取消绑定是有原因的:) – naveen

+0

从一个元素解绑?如果用户喜欢,我们必须重新绑定?我不确定我喜欢那样。 –

0

您需要使用活的()或委托(),而不是点击()。 click()函数分配一次事件,不检查它们是否改变。

1

当您使用click(快捷键bind("click", handler);)时,它将处理程序附加到元素本身,因此更改类或父类不会影响处理程序。您可以尝试$(".likes").live("click, handler);,如果该元素仍然具有该类别,则只会运行该回调

+1

在这种情况下使用'live'确实没有必要。如果你这样做了,那么即使元素失去了它的类,jQuery仍然必须在每次点击时测试它(更不用说每次点击任何其他元素)。稍后解除事件你会好得多。看到我的答案。 –

相关问题