javascript - 如何从一组元素中删除多个事件侦听器?
问题描述
我有一组按钮元素,一旦满足条件,我希望它们变得无响应。我认为removeEventListener应该可以解决问题,但是在我的if 语句返回true之后,按钮仍然是可点击的。
const field = Array.from(document.querySelectorAll(".field"))
const boardData = [];
field.forEach(button => {
const func = (e) => {
if(xTurn) {
if(checkWin(player1)){
freezeBoard(field,func)
};
}
else {
if(checkWin(player2)){
freezeBoard(field,func)
};
}
}
button.addEventListener("click", func)
})
function freezeBoard(buttons,func) {
buttons.forEach(button => {
button.removeEventListener("click", func);
})
}
解决方案
声明func
外部,以便您只创建一个func
- 当您在循环内创建它时,每个侦听器使用不同的引用,因此removeEventListener
不起作用。
const field = Array.from(document.querySelectorAll(".field"))
const boardData = [];
const func = () => {
if (xTurn) {
if (checkWin(player1)) {
freezeBoard(field, func)
};
} else {
if (checkWin(player2)) {
freezeBoard(field, func)
};
}
};
field.forEach(button => {
button.addEventListener("click", func)
})
function freezeBoard(buttons, func) {
buttons.forEach(button => {
button.removeEventListener("click", func);
})
}
可以通过删除参数和压缩条件来简化。
const buttons = Array.from(document.querySelectorAll(".field"))
const boardData = [];
const func = () => {
if ((xTurn && checkWin(player1) || checkWin(player2))) {
freezeBoard(field, func);
}
};
buttons.forEach(button => {
button.addEventListener("click", func)
});
function freezeBoard(buttons) {
buttons.forEach(button => {
button.removeEventListener("click", func);
})
}
推荐阅读
- javascript - couchbase 按部分键查看查询组
- powershell - 带有 Get-Mailbox 和 Get-MailboxStatistics 的 Powershell 脚本缺少输出
- excel - 输入日期后,宏将运行
- java - Apache Timer 运行两次
- android - ScrollView 内的 ConstraintLayout
- python - Python / Pandas / Pulp 优化重复
- django - 显示通过管理员上传的图像
- matrix - Octave:将矩阵导出到文件
- linux - 是否有一种规范的编程方式来查询属于 NUMA 节点的核心集?
- android - 颤动中是否可以在同一行上有输入和跨度?