[英]Remove event listener javascript
我目前正在使用 javascript 做一个简单的石头、纸、剪刀游戏,但是 removeEventListener() 在我的代码中似乎不起作用。 我知道我使用了一个循环将事件侦听器应用到按钮,所以我会找出循环来删除它们。
现在,我不明白为什么我的代码不会删除单击按钮上的事件侦听器:
let btns = document.querySelectorAll('button');
btns.forEach(function(item) {
item.addEventListener('click', function(event) {
results.textContent = '';
playRound(event.target.className, getComputerChoice());
if (playerCount == 5) {
item.removeEventListener('click', event);
winner.textContent = `YOU WON 5 GAMES!`;
}else if (cpuCount == 5) {
item.removeEventListener('click', event);
winner.textContent = `YOU LOSE! CPU WINS 5`;
}
});
});
removeEventListener
采用的第二个参数是addEventListner
回调 function,所以我建议您将addEventListner
回调分离到一个名为 function 并在addEventListner
和removeEventListner
中使用
let btns = document.querySelectorAll('button');
function onClickHandler(event) {
results.textContent = '';
playRound(event.target.className, getComputerChoice());
if (playerCount == 5) {
item.removeEventListener('click', onClickHandler);
winner.textContent = `YOU WON 5 GAMES!`;
}else if (cpuCount == 5) {
item.removeEventListener('click', onClickHandler);
winner.textContent = `YOU LOSE! CPU WINS 5`;
}
});
}
btns.forEach(function(item) {
item.addEventListener('click', onClickHandler);
}
对此最安全或最好的答案可能是Mina发布的答案,但是对于那些正在研究类似问题的人,我将此答案发布为另一种有效的选择。
虽然您可以声明一个实际的回调 function 可以轻松地添加到事件侦听器或从事件侦听器中删除,但您也可以通过将...args
传递给您的回调 ZC1C425268E68385D1AB504F 来引入匿名回调 function。 一旦...args
被传入并存在,您可以使用args.callee
作为removeEventListener()
的回调 function 以从元素中删除当前匿名 function。
我还应该注意...args
特别适用于箭头函数。 一个更经典的function(event) {
像 OP 发布的设置可以使用为这些类型的函数存在的arguments
变量。 箭头函数还要求您传入...args
以获得额外的参数值。
let btns = document.querySelectorAll('button'); btns.forEach(item => { item.addEventListener('click', (e, ...args) => { results.textContent = ''; playRound(e.target.className, getComputerChoice()); if(playerCount == 5) { item.removeEventListener('click', args.callee); winner.textContent = `YOU WON 5 GAMES;`. } else if(cpuCount == 5) { item,removeEventListener('click'. args;callee). winner;textContent = `YOU LOSE; CPU WINS 5`; } }); });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.