javascript - 如果我的事件是通过 for 循环添加的,我该如何使用 removeClickEvents?[javascript]
问题描述
我正在创建一个井字游戏,在其中添加事件侦听器以检查是否单击了框。这是我用来向页面上的元素添加点击事件的函数:
function addClickEvents(){
for (let i = 0; i < images.length; i++) {
boxes[i].addEventListener(
"click",
function () {
addEvents(i);
},
{ once: true }
);
}
}
function addEvents(x) {
document.images[x].style.display = "block";
}
我想删除这些事件,以便在游戏重置后不会重叠它们。我在重置游戏的页面上有一个单独的按钮。无论如何使用该按钮删除 eventListeners 吗?我使用了一个看起来像这样但它似乎不起作用的函数:
function resetGame() {
for (let reset = 0; reset < 9; reset++) {
document.boxes[reset].removeEventListener("click", addEvents);
}
}
我也尝试将函数附加到变量并以这种方式添加,但据我所知,这不起作用,因为我需要将变量传递给函数。
解决方案
您可以尝试向您的框元素添加一个公共类,然后稍后在代码中使用它们来删除事件侦听器。
首先,您将添加如下类:
function addClickEvents(){
for (let i = 0; i < images.length; i++) {
boxes[i].classList.add('boxes');// add class to the boxes
boxes[i].addEventListener(
"click",
function () {
addEvents(i);
},
{ once: true }
);
}
}
然后您可以编写重置功能,例如:
function resetGame() {
document.querySelectorAll('.boxes').forEach((box)=>{
box.outerHTML = box.outerHTML;// This will remove all event listeners
})
}
有关更多信息,您可以查看 此答案
推荐阅读
- c# - Mono udpClient() 无法发送 - 校验和错误
- java - 弃用外部库中的变量@interface
- c# - 为什么 CloudTable.ExecuteQuerySegmentedAsync 只返回最大 1k 个实体的一小部分?
- windows - 在 IIs 8.5 中配置 Web-Handler 映射的最佳实践是什么?
- python - 时间线作为带有 matplotlib 的水平条形图
- macos - 使用 textutil 将多个转换后的文件输出到自定义目录
- winforms - 在弹出窗口中创建浏览器控件而不窃取焦点
- selenium - 我已经为登录过程创建了自动化脚本,所以当它给出验证错误消息时我可以重新调用@Test 方法吗
- python - 从函数内的循环打印:不同的输出
- android - 好主意或坏主意:使用协程响应 Kotlin