2015-03-30 109 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