当我搜索我现在遇到的问题的解决方案时,我找到了这个帖子:jQuery: more than one handler for same event。现在我想知道是否有可能只删除这些处理程序中的一个?
答案 0 :(得分:74)
如果您不使用匿名回调:
var $elt = $(...);
function clickHandler1(event){...}
function clickHandler2(event){...}
// bind both
$elt.click(clickHandler1);
$elt.click(clickHandler2);
// unbind just the first
$elt.unbind('click', clickHandler1);
另请参阅:.unbind()
docs。
答案 1 :(得分:51)
实际上,您可以通过事件命名空间使用匿名回调来执行此操作:
$elt.bind('click.handler1', function(event) {
alert('click handler 1');
});
$elt.unbind('click.handler1');
请参阅修改后的演示here。
和here了解更多信息。
这是在jQuery 1.4.3中添加的,实际上是在问题提出前4个多月才出现。
答案 2 :(得分:0)
这篇文章已有很长的历史了,所以我想今天(2019年)如何做。
上面的大多数旧答案,包括可接受的答案(在编写时是正确的),都使用unbind
方法,此方法自jQuery v.3.0起已被弃用。
自jQuery 3.0起,不推荐使用.unbind()。被它取代 自jQuery 1.7以来的.off()方法,因此它的使用已经 灰心丧气。
以下是使用.off()
方法的方法:
var foo = function() {
// Code to handle some kind of event
};
// ... Now foo will be called when paragraphs are clicked ...
$( "body" ).on( "click", "p", foo );
// ... Foo will no longer be called.
$( "body" ).off( "click", "p", foo );
这将适用于所有通过.on()
方法实现的事件处理程序,并且也适用于未委托的事件处理程序。只需将“ body”替换为元素选择器,然后删除.off()
方法的第二个参数(上例中为“ p”)即可。