我正在一个带有一些遗留代码(不祥的音乐)的基于 javascript 的系统中工作,这个遗留代码添加了这样的事件监听器
foo.addEventListener("click",function(){
//do some stuff
});
有没有办法让我以编程方式删除像这样添加的事件侦听器?我知道removeEventListener,但是从文档中不清楚如何(如果有的话)删除程序员通过匿名函数添加的监听器。
我正在一个带有一些遗留代码(不祥的音乐)的基于 javascript 的系统中工作,这个遗留代码添加了这样的事件监听器
foo.addEventListener("click",function(){
//do some stuff
});
有没有办法让我以编程方式删除像这样添加的事件侦听器?我知道removeEventListener,但是从文档中不清楚如何(如果有的话)删除程序员通过匿名函数添加的监听器。
据我所知,如果你想调用,你不能使用匿名函数,removeEventListener
因为你需要引用你使用的同一个函数,addEventListener
唯一的方法是为函数命名(例如不是匿名的)。
类似的问题和结论:removeEventListener on anonymous functions in JavaScript
在不更改代码结构的情况下,您可以给它一个名称,然后再使用该名称。
foo.addEventListener("click", function fooClickHandler(){
//do some stuff
});
// then later
foo.removeEventListener("click", fooClickHandler);
您可以像添加它们一样通过传入您创建它的处理程序来删除它们。但此时处理程序不再是匿名函数:
var handler = function() {
// do some stuff
};
foo.addEventListener("click", handler);
foo.removeEventListener("click", handler);
你可以做一些像这样的时髦的东西来删除带有匿名函数的处理程序,虽然我不推荐它,但这是可能的,你不能callee
在严格模式下访问:
document.addEventListener('click', function(e) {
console.log('click');
if(e.unbind) {
document.removeEventListener('click', arguments.callee);
}
});
var event;
// First actual real event
event = new Event('click');
document.dispatchEvent(event);
// Unbinding event
event = new Event('click');
event.unbind = true;
document.dispatchEvent(event);
// Should not fire
event = new Event('click');
document.dispatchEvent(event);
如果您想在添加自己的事件侦听器之前摆脱所有事件侦听器,您可以使用 clonenode 并删除原始事件侦听器。该副本不会复制事件侦听器。
var fee = foo.cloneNode();
foo.parentNode.replaceChild(fee, foo);
应该看起来一样,但没有事件监听器。
这里有一个小提琴可以证明我的观点:http: //jsfiddle.net/U7w7M/1/
注意格式是如何保持的,位置是一样的,但是在第一次点击后点击动作被删除了