有很多关于类似主题的问题和答案,但我觉得这是一个略有不同的问题,另一个问题的答案并没有完全回答这个问题。我有一个构造函数,它的原型(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/