是否可以从具有多个处理程序的事件中删除一个特定的事件处理程序?

时间:2011-02-27 22:00:02

标签: jquery

当我搜索我现在遇到的问题的解决方案时,我找到了这个帖子:jQuery: more than one handler for same event。现在我想知道是否有可能只删除这些处理程序中的一个?

3 个答案:

答案 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);

A wild Demo appeared!

另请参阅:.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()方法,因此它的使用已经   灰心丧气。

Source

以下是使用.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 );

Source

这将适用于所有通过.on()方法实现的事件处理程序,并且也适用于未委托的事件处理程序。只需将“ body”替换为元素选择器,然后删除.off()方法的第二个参数(上例中为“ p”)即可。