2015-03-30 114 views
3

我想知道是否有一个优雅的方式从HTML元素中删除特定的事件侦听器,而不会影响类似的事件。如何从父级删除jQuery事件侦听器而不删除相似的侦听器?

Ex。

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(); 

所以,问题是:如何删除对象a“上单击事件•不用卸下b的事件?

$('body').off('click'); //removes both event listeners 

我假设大多数方法都会杀死两个听众。很高兴看到任何优雅的回应。

回答

8

一个选择是namespace the events

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

大答案乔希(我会给你点)。

以下不起作用(我做了一个错误的假设,相信这会起作用)......所以没有人使用这个答案。谢谢@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

不,那是不行的,它会删除这两个事件处理程序。 'x'和'y'中的jQuery对象并没有保存任何关于它们的信息,所以它们不能用于撤消它们。 – Guffa 2015-03-30 20:18:40