技术与生活 / 一篇记录
列表后来才生成,点击事件也能接住
把监听器放在稳定父节点上,可以处理后来加入的子元素。
事件会沿 DOM 路径传播,稳定的父节点可以统一判断哪个子元素触发操作。这样新增列表项后不必为每个元素重新注册同一套处理器。
从一个例子看起
以下示例可在现代浏览器的开发者工具中观察;涉及 DOM 的代码需要在网页环境运行。
document.addEventListener('click', e => { if (!(e.target instanceof Element)) return; const a = e.target.closest('a'); if (a) console.log(a.pathname); });
新增链接后点击,检查父层监听器仍能处理。
排查时再往前走一步
点击链接文字、图标和空白区域分别测试目标解析。还要检查 stopPropagation、嵌套组件和 Shadow DOM 是否改变了预期传播路径。
委托处理器还需要确认找到的链接确实属于目标组件。多个列表共用页面时,范围过大的 document 监听可能收集到不相关操作,稳定父容器往往是更合适的边界。
事件目标不总是期望的元素类型,使用 closest 前应先检查目标是否为 Element。
参考:JavaScript 文档。