removeEventListener在JavaScript中的匿名函数

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (86)

我有一个对象,它有方法。这些方法放入匿名函数中的对象中。它看起来像这样:

var t = {};
window.document.addEventListener("keydown", function(e) {
    t.scroll = function(x, y) {
        window.scrollBy(x, y);
    };
    t.scrollTo = function(x, y) {
        window.scrollTo(x, y);
    };
});  

(有更多的代码,但这足以显示问题)

现在我想在某些情况下停止事件侦听器。因此,我试图做一个removeEventListener,但我无法弄清楚如何做到这一点。我已经阅读过其他问题,无法在匿名函数上调用removeEventListener,但在这种情况下,情况也是这样吗?

我在匿名函数中创建了一个方法,因此我认为这是可能的。看起来像这样:

t.disable = function() {
    window.document.removeEventListener("keydown", this, false);
}

为什么我不能这样做?

有没有其他(好)的方法来做到这一点?

奖金信息; 这只需要在Safari中工作,因此缺少即支持。

提问于
用户回答回答于

我相信这是一个匿名函数的重点,它缺少一个名称或一种方法来引用它。

如果我是你,我只是创建一个命名函数,或者把它放在一个变量中,以便引用它。

var t = {};
var handler = function(e) {
    t.scroll = function(x, y) {
        window.scrollBy(x, y);
    };
    t.scrollTo = function(x, y) {
        window.scrollTo(x, y);
    };
};
window.document.addEventListener("keydown", handler);

你可以通过删除它

window.document.removeEventListener("keydown", handler);   
用户回答回答于

如果你在实际函数中,你可以使用arguments.callee作为函数的参考。如下所示:

button.addEventListener('click', function() {
      ///this will execute only once
      alert('only once!');
      this.removeEventListener('click', arguments.callee);
});

这将无法正常工作,如果你在严格模式("use strict";

扫码关注云+社区