2011-08-16 54 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仍然必須在每次點擊時測試它(更不用說每次點擊任何其他元素)。稍後解除事件你會好得多。看到我的答案。 –

相關問題