如何从父元素中移除jQuery事件监听器,而不删除类似的监听器?

4
我想知道是否有一种优雅的方法可以从HTML元素中删除特定的事件监听器,而不影响类似的事件。
例如:
var a = {
  addEvent: function(){
     $('body').on('click', function(){
      //does something here.
     });
  }
}

var b = {
  addEvent: function(){
     $('body').on('click', function(){
      //does something else here.
     });
   }
}

a.addEvent();
b.addEvent();

所以问题是:如何在不删除 b 的事件的情况下,移除点击事件中的对象 a
$('body').off('click'); //removes both event listeners

我认为大多数方法都会同时终止两个监听器。如果有任何优雅的解决方案,那将是很好的。

2个回答

9

一个选择是给事件命名空间

var a = {
  addEvent: function(){
     $('body').on('click.a', function(){
       //does something here.
     });
  }
}

var b = {
  addEvent: function(){
     $('body').on('click.b', function(){
       //does something here.
     });
   }
}

a.addEvent();
b.addEvent();

$('body').off('click.a'); //removes the a event listener

2

非常好的答案Josh(我会给你点数)。

以下内容无法正常工作(我做出了错误的假设以为这会起作用)...划掉,以免有人使用此答案。感谢@Guffa。

我找到了另一种值得分享的解决此问题的方法:

var x = $('body').on('click', function(){
                //does something here
        });

var y = $('body').on('click', function(){
                //does something else here
        });

x.off('click'); //this does not remove the event handler assigned to y

为了清晰起见,我没有编写原始对象中的代码。


2
不行,那样做不起作用,它将删除两个事件处理程序。变量xy中的jQuery对象不保留它们用于什么的任何信息,因此不能使用它们来撤消操作。 - Guffa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接