2012-01-15 57 views
8

由於某種原因,jQuery.off('click')在這裏似乎不起作用。當模型中點擊「是」按鈕時,會彈出另一個模型。我究竟做錯了什麼?jQuery.off()沒有刪除綁定

代碼:

$(function(){ 

    //If there are warnings on the page bind alert 
    if ($('.renewal-warning').length > 0){ 

    (function(){ 

     $('#signRentalContainer').on('click', '.renewal-warning', function(e){ 

     var buttonHandle = this; 

     //Prevent submission 
     e.preventDefault(); 

     //Show warning model 
     $.modal({ 
      content: $('#renewalWarning').html(), 
      title: "Order Renewal Warning", 
      buttons: { 
      'Yes': function(win) { $(buttonHandle).off('click').click(); }, 
      'No': function(win) { win.closeModal(); } 
      }, 
      maxWidth: 250, 
      closeButton: false 
     }); 
     }); 
    })(); 
    } 
}); 

回答

10

敢肯定你會需要爲它提供了相同的元素,以及相同的選擇。

$('#signRentalContainer').off('click', '.renewal-warning'); 

.on()處理器,this'.renewal-warning'元素被點擊,而不是#signRentalContainer元素。


如果有幾個這樣的'.renewal-warning'元素,而你只需要在一個時間來禁用一個,最簡單的方法是改變其類,以便它不再是選擇匹配。

$(this).removeClass('renewal-warning') 
     .addClass('renewal-warning-disabled'); 
+0

爲什麼不是在這種情況下,處理工作?我認爲jQuery改變了範圍以匹配事件? – Steven 2012-01-15 08:00:10

+0

@Steven:哦,那是你爲什麼要做'.off()'?我猜這個事件正在冒泡。嘗試添加'e.stopPropagation()'到處理程序,而不是'off()'。 – 2012-01-15 08:02:32

+0

......或者這是因爲你正在對已被點擊的元素執行'.click()'。那是爲什麼?嘗試刪除它。 – 2012-01-15 08:03:40

3

因爲this引用句柄函數的上下文,而不是函數本身。

嘗試使一個命名函數,然後引用它,當你調用off

$("body").off("click", '#signRentalContainer', buttonHandle);

BTW,任何原因,我們不能用unbind直接在這裏?

$("#signRentalContainer").unbind("click");

+2

不使用解除綁定的原因:只是嘗試堅持jQuery團隊的建議。 「從jQuery 1.7開始,.on()和。off()方法是首選附加和刪除元素的事件處理程序。「[來源](http://api.jquery.com/unbind/) – Steven 2012-01-15 08:13:33

+0

@Steven得到它:) – satoru 2012-01-15 08:52:48

+1

@Steven」首選「..這是一個我不希望聽到文件,這是要做或不做的方式..「首選」聽起來很瘋狂 – 2017-05-13 16:37:09