0

我正在一个带有一些遗留代码(不祥的音乐)的基于 javascript 的系统中工作,这个遗留代码添加了这样的事件监听器

foo.addEventListener("click",function(){
    //do some stuff
});

有没有办法让我以编程方式删除像这样添加的事件侦听器?我知道removeEventListener,但是从文档中不清楚如何(如果有的话)删除程序员通过匿名函数添加的监听器。

4

3 回答 3

2

据我所知,如果你想调用,你不能使用匿名函数,removeEventListener因为你需要引用你使用的同一个函数,addEventListener唯一的方法是为函数命名(例如不是匿名的)。

类似的问题和结论:removeEventListener on anonymous functions in JavaScript


在不更改代码结构的情况下,您可以给它一个名称,然后再使用该名称。

foo.addEventListener("click", function fooClickHandler(){
    //do some stuff
});

// then later
foo.removeEventListener("click", fooClickHandler);
于 2013-11-06T22:40:28.693 回答
1

您可以像添加它们一样通过传入您创建它的处理程序来删除它们。但此时处理程序不再是匿名函数:

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);
于 2013-11-06T22:59:17.753 回答
1

如果您想在添加自己的事件侦听器之前摆脱所有事件侦听器,您可以使用 clonenode 并删除原始事件侦听器。该副本不会复制事件侦听器。

  var fee = foo.cloneNode();
  foo.parentNode.replaceChild(fee, foo);

应该看起来一样,但没有事件监听器。

这里有一个小提琴可以证明我的观点:http: //jsfiddle.net/U7w7M/1/

注意格式是如何保持的,位置是一样的,但是在第一次点击后点击动作被删除了

于 2013-11-06T22:55:06.987 回答