javascript - addEventListener 仍然多次触发(即使使用同名回调)
问题描述
下面的代码只是将一个事件应用于多个 DOM 元素。由于这组代码将被多次调用,因此事件将多次应用于同一元素。
我避免让它们再次被分配(通过使用相同的回调函数而不是匿名函数),但它们仍然被应用和触发了几次。我在这里没有看到什么?
//apply delete event listener to all list items
function applyListener(){
let delBtnS = document.querySelectorAll(".toDoList li span")
let checkOff = document.querySelectorAll(".toDoList li");
//separate function won't have event applied multiple times
let applyCompleted = function(){
console.log("Apply has been pressed");
}
let applyDelete = function(event){
console.log("Delete has been pressed");
}
//checkOff
for (let item of Array.from(checkOff)){
item.addEventListener("click", applyCompleted);
}
//delete button
for (let btn of Array.from(delBtnS)){
btn.addEventListener("click", applyDelete);
}
}
解决方案
这是因为事件沿 DOM 树向上传播,这意味着即使事件发生在子节点上,父节点也会对事件做出反应。您需要使用stopPropagation
let applyDelete = function(event){
event.stopPropagation(); // click on <span> won't travel to it's parent <li>
console.log("Delete has been pressed");
}
推荐阅读
- mysql - Laravel 事务回滚
- node.js - 节点 lambda 未写入 DynamoDB 且没有错误
- angular - 是否可以使用类型映射和条件类型只需要对象中的某些指定键?
- php - GitLab CI shell 运行程序不继承系统环境变量
- node.js - objection.js modifyEager .as('count') 似乎对 .count() 没有任何作用
- django - 使用 mod_wsgi 在 apache 上部署 django 应用程序时出现“没有名为“编码”的模块”错误
- reporting-services - SSRS 报告列问题
- c# - XmlSerializer 在反序列化时抛出 StackOverflowException,但前提是它是从 ASMX Web 服务调用的
- python - 具有自定义匹配功能的 Python 序列匹配器
- apollo - Apollo CodeGen 无法生成 TS 类型