JS - 如何在不重新加载网页的情况下删除活动的 eventListener
JS - How to remove an active eventListener without reloading the web page
我有一个启动 eventListener 的 playGame() 函数。每次开始新游戏时,playGame() 函数似乎都会创建一个额外的 eventListener。我怎样才能删除活动的 eventListener 以便每次玩游戏时都不会添加新的。
我已尝试使用此处概述的 removeEventListener - https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener。
我也看过类似的堆栈溢出问题(比如 ),但那里的解决方案不适用。
功能布局如下。我尝试在加载其余游戏脚本之前删除旧的 eventListener。
function playGame() {
console.log('new game');
// should remove event listener from previous game
document.removeEventListener('keyup', function() {userInput(activeStringObj, event.key);});
loadStartOutput();
wordPicker(activeStringObj);
addLetterDivs(activeStringObj);
addHint(activeStringObj);
document.addEventListener('keyup', function() {userInput(activeStringObj, event.key);});
}
我正在记录记录用户按键的数组,很明显多个 eventListeners 正在记录输入。
new game (typed 'a' 's')
game.js:98 ["a"]
game.js:98 (2) ["a", "s"]
new game (typed 'd' 'f')
game.js:98 (3) ["a", "s", "d"]
game.js:98 (4) ["a", "s", "d", "d"]
game.js:98 (5) ["a", "s", "d", "d", "f"]
game.js:98 (6) ["a", "s", "d", "d", "f", "f"]
new game (typed 'h' 'j')
game.js:98 (7) ["a", "s", "d", "d", "f", "f", "h"]
game.js:98 (8) ["a", "s", "d", "d", "f", "f", "h", "h"]
game.js:98 (9) ["a", "s", "d", "d", "f", "f", "h", "h", "h"]
game.js:98 (10) ["a", "s", "d", "d", "f", "f", "h", "h", "h", "j"]
game.js:98 (11) ["a", "s", "d", "d", "f", "f", "h", "h", "h", "j", "j"]
game.js:98 (12) ["a", "s", "d", "d", "f", "f", "h", "h", "h", "j", "j", "j"]
我希望每次按下一个键时只将一个字母添加到数组中。
你必须通过指针传递相同的函数来删除,函数主体是相同的但它们不是同一个对象,它是指向具有相同主体的 2 个不同函数对象的 2 个单独的指针。
或者添加一次事件侦听器,并将您拥有的当前游戏对象作为参数传递给处理程序
添加和删除事件侦听器时,处理函数(包括函数签名)应该相同。在您的代码中,您已经编写了两次相同的函数定义!这意味着相同的函数被声明了两次。它的功能不一样。相反,试试这个:
function takeAction(event) {
userInput(activeStringObj, event.key)
}
function playGame() {
console.log('new game');
// should remove event listener from previous game
document.removeEventListener('keyup', takeAction);
loadStartOutput();
wordPicker(activeStringObj);
addLetterDivs(activeStringObj);
addHint(activeStringObj);
document.addEventListener('keyup', takeAction);
}
这应该可以为您完成工作。
我有一个启动 eventListener 的 playGame() 函数。每次开始新游戏时,playGame() 函数似乎都会创建一个额外的 eventListener。我怎样才能删除活动的 eventListener 以便每次玩游戏时都不会添加新的。
我已尝试使用此处概述的 removeEventListener - https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener。
我也看过类似的堆栈溢出问题(比如
功能布局如下。我尝试在加载其余游戏脚本之前删除旧的 eventListener。
function playGame() {
console.log('new game');
// should remove event listener from previous game
document.removeEventListener('keyup', function() {userInput(activeStringObj, event.key);});
loadStartOutput();
wordPicker(activeStringObj);
addLetterDivs(activeStringObj);
addHint(activeStringObj);
document.addEventListener('keyup', function() {userInput(activeStringObj, event.key);});
}
我正在记录记录用户按键的数组,很明显多个 eventListeners 正在记录输入。
new game (typed 'a' 's')
game.js:98 ["a"]
game.js:98 (2) ["a", "s"]
new game (typed 'd' 'f')
game.js:98 (3) ["a", "s", "d"]
game.js:98 (4) ["a", "s", "d", "d"]
game.js:98 (5) ["a", "s", "d", "d", "f"]
game.js:98 (6) ["a", "s", "d", "d", "f", "f"]
new game (typed 'h' 'j')
game.js:98 (7) ["a", "s", "d", "d", "f", "f", "h"]
game.js:98 (8) ["a", "s", "d", "d", "f", "f", "h", "h"]
game.js:98 (9) ["a", "s", "d", "d", "f", "f", "h", "h", "h"]
game.js:98 (10) ["a", "s", "d", "d", "f", "f", "h", "h", "h", "j"]
game.js:98 (11) ["a", "s", "d", "d", "f", "f", "h", "h", "h", "j", "j"]
game.js:98 (12) ["a", "s", "d", "d", "f", "f", "h", "h", "h", "j", "j", "j"]
我希望每次按下一个键时只将一个字母添加到数组中。
你必须通过指针传递相同的函数来删除,函数主体是相同的但它们不是同一个对象,它是指向具有相同主体的 2 个不同函数对象的 2 个单独的指针。
或者添加一次事件侦听器,并将您拥有的当前游戏对象作为参数传递给处理程序
添加和删除事件侦听器时,处理函数(包括函数签名)应该相同。在您的代码中,您已经编写了两次相同的函数定义!这意味着相同的函数被声明了两次。它的功能不一样。相反,试试这个:
function takeAction(event) {
userInput(activeStringObj, event.key)
}
function playGame() {
console.log('new game');
// should remove event listener from previous game
document.removeEventListener('keyup', takeAction);
loadStartOutput();
wordPicker(activeStringObj);
addLetterDivs(activeStringObj);
addHint(activeStringObj);
document.addEventListener('keyup', takeAction);
}
这应该可以为您完成工作。