JavaScript:从该侦听器中删除事件侦听器?

jay*_*rjo 7 javascript garbage-collection dom-events

我总是想知道这种方法有多干净 - 从那个侦听器中删除一个事件监听器.

更新:

在内部我保留了对象和侦听器的哈希值,因此我可以从任何地方删除事件侦听器.我只关心从内部删除它.这样的行动会不会真的有效?

UPDATE

我问的是addEventListener,removeEventListener的东西.

bro*_*eib 27

您可以传递once选项让侦听器仅操作一次,然后自行删除。文档:https : //developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Parameters

例子:

  element.addEventListener('eventname', (ev) => {
    console.log("event is captured only once.");
    // do more stuff...
  }, { once: true });
Run Code Online (Sandbox Code Playgroud)

从上面的相同文档链接,现代浏览器支持很好,但不适用于 Internet Explorer。

  • 是的......我认为当我问最初的问题时,这是不可用的:D (2认同)

bha*_*ral 10

我刚看到这个因为我想知道完全相同的问题!

arguments.callee是你的朋友......

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments/callee

所以你有

blah.addEventListener('click',function(e){
    e.source.removeEventListener('click', arguments.callee);
    blee bloo bleep
});
Run Code Online (Sandbox Code Playgroud)

这适用于Titanium Appcelerator,所以它也应该在javascript中工作(因为它们是同一件事)

()在这个例子中,NB不要添加到arguments.callee的末尾,除非你喜欢看... bah dum tish!.

事实上,如果你不想使用arguments.callee,这也可以工作(未经测试):

blah.addEventListener('click', anyThingYouWantHere : function(e){
    e.source.removeEventListener('click', anyThingYouWantHere);
    blee bloo bleep
});
Run Code Online (Sandbox Code Playgroud)

其中"anythingYouWantHere"是你想要的任何变量名称〜你在添加它时有效地"命名"了这个函数.

  • 这在 ES5 严格模式下是不允许的,不是吗? (3认同)

JCL*_*oot 6

我刚刚制作了一个生成自毁事件侦听器的包装函数:

let addSelfDestructingEventListener = (element, eventType, callback) => {
    let handler = () => {
        callback();
        element.removeEventListener(eventType, handler);
    };
    element.addEventListener(eventType, handler);
};
Run Code Online (Sandbox Code Playgroud)

到目前为止效果很好:)


sdl*_*rhc 1

您可以尝试这样的事情,具体取决于它的名称:

some_div.onclick = function () {
    ...
    this.onclick = null;
    // or: some_div.onclick = null;
};
Run Code Online (Sandbox Code Playgroud)

或者是您关心的事件侦听器?因为这些有点复杂。