【问题标题】:How to remove an event listener in javascript?如何在javascript中删除事件监听器?
【发布时间】:2013-02-26 22:23:57
【问题描述】:

我想知道如何在添加一个事件侦听器后删除一个事件侦听器,您在 jquery 中使用 on 和 off 的方式?

document.removeEventListener('touchstart');
document.addEventListener('touchstart', function (e) {
     closePopupOnClick(e, popup);
});

但这实际上并没有移除事件监听器。如果我将 addEventListener 代码放在一个函数中并将该函数传递给 removeEventListener 它将不起作用,因为你不能将参数传递给函数。有人知道怎么做吗?

【问题讨论】:

标签: javascript touch


【解决方案1】:

将监听器作为变量并通过.addEventListener附加

var myListener = function (e) {
    closePopupOnClick(e, popup);
};
document.addEventListener('touchstart', myListener, true);

然后在使用.removeEventListener删除时再次传递它

document.removeEventListener('touchstart', myListener);

如果您不是处于严格模式,您可以使用arguments.callee 使侦听器自行移除

document.addEventListener('touchstart', function (e) {
    closePopupOnClick(e, popup);
    document.removeEventListener('touchstart', arguments.callee);
}, true);

如果你在严格模式下,你必须使用一个命名函数表达式如果你想一个函数删除自己

document.addEventListener('touchstart', function myListener(e) {
    closePopupOnClick(e, popup);
    document.removeEventListener('touchstart', myListener);
}, true);

如果您想在侦听器中使用可能被某些东西(例如循环)更改的变量,那么您可以编写一个生成器函数,例如

function listenerGenerator(popup) {
    return function (e) {
        closePopupOnClick(e, popup);
    };
}

现在您可以使用listenerGenerator(popup) 创建侦听器,它将作用于popup 变量。请注意,如果popup 是一个Object,它将是ByRef,因此可能仍会发生变化。

【讨论】:

  • 如何将 e 和 popup 参数传递给 addEventListener 中的 myListener 函数?这就是我最坚持的。是参数。
  • epopup 来自哪里? eEvent 吗?那么你需要设置 useCapture true
  • addEventListener 函数位于将弹出参数传递给它的函数内部。所以它来自外部函数。 e 是事件。如何设置 userCapture?
  • @Tanya useCaptureaddEventListener的第三个参数;参数是 typelistener 和(可选)useCapture(默认为 false)。请阅读我的答案中的链接以获取更多详细信息。
  • 使用重音符号` 在 cmets 中制作代码块。只需从closePopupTouch的参数列表中删除popup;即closePopupTouch = function (e) { closePopupOnClick(e, popup); };。这意味着函数内部的popup 将取自定义函数的范围。我所说的listenerGenerator 是为popup 创建一个新范围,以保护函数内部的副本不受外部任何更改的影响。
【解决方案2】:

我认为这样做的一个好方法是自己添加一个事件,然后调用

event.stopImmediatePropagation()

例如:

htmlElement.addEventListener('touchstart', (event) => event.stopImmediatePropagation());

在 Chrome 中有类似的功能

htmlElement.removeAllListeners()

这可能会真正删除侦听器。但我认为这不是一个明智的解决方案,因为它似乎没有得到其他浏览器的良好支持。

【讨论】:

    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 2019-08-26
    • 2017-01-16
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    相关资源
    最近更新 更多