2012-01-15 41 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