jQuery:如何解除绑定到文档对象的事件?

rea*_*ebo 14 javascript jquery events

我有一个编程错误的库正在这样做

$(document).on('click','#keep_first_only_button', function(){
Run Code Online (Sandbox Code Playgroud)

在此之后,我写了一段代码来"覆盖"这种不良行为

$("keep_first_only_button").unbind("click");
$("keep_first_only_button").on("click", selectKeepFirstOfAll);
Run Code Online (Sandbox Code Playgroud)

但这不起作用,然后再次触发document.click函数处理程序

我无法取消绑定文档中的所有点击事件,因为灾难将在页面中发生.

在这种情况下,哪种方法正确?

编辑:抱歉时间丢失问题,我没有在选择器中看到缺少的'#'.我真的很抱歉 !

Mat*_*ens 26

原始事件处理程序被绑定为委托事件,因此您无法将其从$('#keep_first_only_button')自身中删除.您需要在document关卡中删除它.

文档:

要删除特定的委托事件处理程序,请提供selector 参数.选择器字符串必须与.on()附加事件处理程序时传递给的字符串完全匹配 .要在不删除非委派事件的情况下从元素中删除所有委派事件,请使用特殊值"**".

换句话说,要解除委托事件的绑定,您应该使用您用来绑定它们的相同参数集,而是将它们传递给它们off.由于绑定函数是匿名的,因此您无法引用它,因此您必须解决绑定在该级别上的所有委托事件处理程序:#keep_first_only_buttondocument

$(document).off('click', '#keep_first_only_button');
Run Code Online (Sandbox Code Playgroud)

编辑:看起来问题只是缺少哈希.奇怪的是,我以为你无法使用常规 .off()电话解除委托事件处理程序的绑定...


dKe*_*Ken 7

$("#keep_first_only_button")...
Run Code Online (Sandbox Code Playgroud)

缺少哈希?


Tre*_*ler 5

对于任何想知道的人...... Mattias Buelens是对的.

如果你有像这样绑定的元素

$(document).on("click","#element",function(){ });
Run Code Online (Sandbox Code Playgroud)

并希望以后关闭它,你必须这样做:

 $("#element").click(function(e) { 
    $(document).off('click', '#element'); 
});
Run Code Online (Sandbox Code Playgroud)