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

时间:2011-02-08 17:36:37

标签: javascript javascript-events garbage-collection

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

更新

在内部我保留了对象和侦听器的哈希值,因此我可以从任何地方删除事件侦听器。我只关心将它从内部移除。这样的行动实际上会起作用吗?

更新

我在询问addEventListener,removeEventListener的内容。

6 个答案:

答案 0 :(得分:9)

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

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
});

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

请勿在此示例中将()添加到a​​rguments.callee的末尾,除非您希望看到...... bah dum tish!

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

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

“anythingYouWantHere”是你想要的任何变量名称〜你在添加它时有效地“命名”了这个函数。

答案 1 :(得分:1)

您可以尝试这样的方式,具体取决于它的调用方式:

some_div.onclick = function () {
    ...
    this.onclick = null;
    // or: some_div.onclick = null;
};

或者您关注的是事件听众吗?因为那些有点复杂。

答案 2 :(得分:1)

您可以通过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 });

从上面相同的docs链接来看,现代的浏览器支持不错,但Internet Explorer无法使用。

答案 3 :(得分:0)

如果你使用jQuery,你可能会有一些方便的方法暴露与事件处理程序交互 - 请参阅bind()/ unbind(),delegate()/ undelegate(),one()和similar methods

我对其他框架没有太多经验,但我认为它们提供类似的功能。如果您根本没有使用框架,@ ssleihssirhc有一个可接受的答案。

编辑:啊,也许你正在寻找更像addEventListener()removeEventListener()的东西。同样,框架将为您的交互提供一些便利,并在某些情况下为您省去重新发明轮子的麻烦。

答案 4 :(得分:0)

我刚刚制作了一个包装函数,该函数可以生成自毁事件监听器:

float

到目前为止,效果很好:)

答案 5 :(得分:0)

@bharal的答案现在给了我这个解决方案:

//example
addBlurListener(element, field) {
    const listenToBlur = (e) => {
        e.target.removeEventListener(e.type, listenToBlur);
        //your stuff
    };
    element.addEventListener('blur', listenToBlur);
},