2013-02-22 53 views
2

是否有可能取消綁定匿名回調函數...的Javascript取消綁定匿名回調函數

link.addEventListener("click", function() { 
    //Any piece of code 
}, true); 

link.removeEventListener("click", function() { 
    //Any piece of code 
}); 

感謝, 阿然

+0

這可能是相關的:http://stackoverflow.com/a/3222540/551093 – 2013-02-22 14:13:37

+0

我cursious,爲什麼這個問題被問。這似乎意味着你意識到* named *事件監聽器可以被刪除,這將是一個簡單的改變。難道你絕對不能改變這段代碼,而你正在尋找一種解決方法,但是很難看?您可以通過原型設計劫持'addEventListener',將其添加到存儲偵聽器的命名引用的代理函數中。可怕?是。 – 2013-02-22 14:21:36

+0

[我的概念證明](http://jsfiddle.net/6LduX/)我在上面討論。 – 2013-02-22 14:31:39

回答

2

功能由指針確定的。你沒有指向你的匿名函數的指針,所以你沒有任何東西可以傳遞給remove()來告訴它要刪除哪個函數。

只需傳遞一個重複函數就不會這樣做,因爲重複函數具有不同的指針。

您需要堅持將函數分配給變量,然後將該變量傳遞給remove()。

+0

's/pointer/reference /' – 2013-02-22 14:14:14

3

不是。因爲那些匿名函數實際上是不同的。這與{ a: 1 } === { a: 1 }返回false的原因相同。

你需要做到以下幾點:

var func = function() { ... }; 

element.addEventListener('click', func, false); 

element.removeEventListener('click', func, false); 
3

是。您可以通過在某處使用arguments.callee保存處理匿名事件處理函數的句柄,然後使用此保存的引用來解除綁定。

// binding 
var el = document.getElementById('foo'); 
el.addEventListener('click', function(e) { 
    alert('Hi'); 

    // this is where we save a handle to the anonymous handler 
    // arguments.callee gives us a reference to this function 
    el['_ev'] = arguments.callee; 

}, false); 


// unbinding 
var el = document.getElementById('foo'), handler = el['_ev']; 
if(handler) { 

    // here we use the saved reference to unbind it   
    el.removeEventListener('click', handler); 

    el['_ev'] = false; 
} 

演示:http://jsfiddle.net/jrXex/2/