javascript - 如何在方法中的 addEventListener 和 JavaScript 中的全局函数中的 removeEventListener 时调用 removeEventLisener

标签 javascript methods event-handling

有很多关于类似主题的问题和答案,但我觉得这是一个略有不同的问题,另一个问题的答案并没有完全回答这个问题。我有一个构造函数,它的原型(prototype)有一个 addEventListener,用一个全局函数调用,一次。 Once 需要是全局的,但是 addEventListener 需要在原型(prototype)的方法中。我将如何删除事件监听器,是将 once.bind(that) 放入 removeEventListener 中还是将 once 放入函数中?

var once = function(event) {
  removeEventListener("keydown", /*something*/);
}
Chomp.prototype.playerMove = function() {
  var that = this;
  addEventListener("keydown", once.bind(that)); 
}

提前致谢! :)

最佳答案

在“非严格”模式下,您可以使用 arguments.callee 获取对函数 once 的引用,由 once.bind(that )。不幸的是,在 ES5 严格模式下,该功能已被删除。

您可以调用一个单独的函数(必须命名,以便它可以传递给 removeEventListener)来处理事件处理程序的解除绑定(bind)。

Chomp.prototype.playerMove = function() {
    var that = this;
    var local_once = function() {
        removeEventListener('keydown', local_once);  // deregister this function
        return once.apply(that, arguments);          // invoke global "once"
    }
    addEventListener('keydown', local_once);
}

[为时已晚 - 我刚刚意识到这当然需要修改 once,但是没有其他方法可以引用 once.bind(that) 生成的函数除非它存储在您的原始 once 可以访问的地方。此解决方案将“只调用一次”逻辑保留在 .playerMove] 本地。

关于javascript - 如何在方法中的 addEventListener 和 JavaScript 中的全局函数中的 removeEventListener 时调用 removeEventLisener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27735831/

相关文章:

javascript - 找不到 Angular 6 setTimeout 模块 : Error: Can't resolve 'timers'

javascript - jQuery - 计算元素进入视口(viewport)时的滚动比率?

javascript - 监听 iframe 内容的 addEventListener

javascript - JS 对象字面量,this 上下文发生变化

javascript - 如何将结果添加到我的范围 ng-click?

javascript - 单击参数中的按钮时如何获取包含对象的选定单选按钮值

JavaScript 方法传递参数

objective-c - 如何创建一个直接接受格式字符串作为参数的方法?

c# - ConfigurationSettings.AppSettings 已过时

event-handling - Windows 手机 : how to manage shake events?