2012-10-19 36 views
0

我遇到了解除特定元素上的單擊事件的問題。這是我的JS代碼。取消綁定點擊裏面();

$(document).on('click','.likecomment', function(e){ 
     e.preventDefault(); 
     var commentid = $(this).data('commentid'); 
     $.ajax({ 
      type: 'POST', 
      url: '?category=likecomment', 
      data: { 
       "commentid" : commentid 
      }, 
      success: function(){ 
       $(this).unbind('click'); 
       var likes = $('#'+commentid+'-likes').text(); 
       likes++; 
       $('#'+commentid+'-likes').html(likes); 
      } 
     }); 
    return false; 
}); 

一次點擊後元件的功能仍然存在。我怎樣才能防止它在第一次點擊後被點擊?如果代碼是正確的,我可能會自己找出問題,但我只是想確保代碼是否正確。

+1

爲什麼不去['.one()'](http://api.jquery.com/one/) –

+0

可能是因爲他有不止一個'.likecomment',而.one只會允許一個他們被點擊,而不是隻有一次點擊。 –

+0

@sogeek我個人認爲這不是一個好主意,因爲它給用戶留下了一個按鈕,他可以點擊而沒有任何影響,也沒有任何反饋。 – 2012-10-19 14:40:08

回答

1

因爲您將事件委託給document對象,所以處理程序綁定在document上,而不是在每個單獨的.likecomment元素上。

如果有多個委託事件匹配的元素,您不想解除綁定事件,並且您可能不想刪除likecomment類,因爲它可能與樣式相關聯。

相反,使用一個選擇器強制不匹配時添加另一個類。 done被用於這個例子中,雖然也可以finishedliked,或者一些其他類的名字,你喜歡:

$(document).on('click', '.likecomment:not(.done)', function() {...}); 

而當你想從會產生點擊事件停止元素時,done類添加到元素:

$(this).addClass('done'); 

添加新的類也提供了改變款式likecomment,使其看起來不再點擊一個鉤。

+0

感謝您的精心解答。似乎是最複雜的方式來做到這一點。 – user1683645

1

這可能是因爲你在成功處理程序中解除綁定。如果你的ajax調用需要一段時間,那麼你的解除綁定也需要一段時間。因此,您的$ .ajax嘗試後:

$(this).prop({disabled: true}); 
+1

@zzzzBov那麼不在這個例子中:http://jsfiddle.net/hKM56/ – 2012-10-19 14:49:34

+0

我可以發誓,當禁用時,元素仍然會觸發'click'事件... [我錯了](http://jsfiddle.net/TRCXx/)。對此感到抱歉。 – zzzzBov

3

使用匹配的.off語法。

$(document).off('click','.likecomment'); 

或使當前的元素不再匹配.likecomment

$(this).removeClass("likecomment"); 

$(this).removeClass("delegated"); 
// with this change to binding method: 
$(document).on('click','.likecomment.delegated', function(e){ 

但是需要記住的是this你成功的呼叫裏面是不是它的同this外,你需要添加這個ajax選項:context: this,這樣你的ajax裏面的this將會就像它在你的ajax之外一樣。

+0

off()函數不會禁用class屬性likecomment的所有元素嗎?所以通過「簡單地」添加上下文:在像ajax對象字面值這樣的數據{context:this}將使這個工作在回調函數內? – user1683645

+1

不,因爲click事件綁定到文檔,而不是'.likecomment'元素。如果你想停止事件發生到那一個元素,使這一個元素不匹配'.likecomment' –

+1

我不喜歡去除'likecomment'的想法,因爲它看起來像是將使用類的類造型。 [更新選擇器並添加一個新類]會更好一點[http://stackoverflow.com/a/12976613/497418]。 – zzzzBov