事件委托通过将监听器绑定在父元素上利用冒泡机制处理子元素事件,减少内存占用并支持动态内容;核心是用event.target配合matches()或closest()识别目标元素,需注意事件冒泡限制与性能优化。
事件委托利用事件冒泡机制,把事件监听器绑定在父元素上,而不是每个子元素单独绑定。这样既减少内存占用,又让动态添加的子元素自动响应事件,性能和可维护性都更好。
DOM事件会从触发目标逐级向上冒泡到根节点。只要父元素监听了事件,就能捕获子元素冒泡上来的事件,并通过 event.target 准确识别真正被点击的是哪个子元素。
比如一个列表有100个 ,不委托就得绑定100次 click;用委托只需绑定1次到 ,再判断 event.target 是否为 即可。
用 addEventListener 绑定在父容器,再用条件判断筛选目标元素:
"li"、".btn-delete")示例:
document.getElementById('list').addEventListener('click', function(e) {
if (e.target.matches('li')) {
console.log('点击了列表项:', e.target.textContent);
}
});
新增的子元素无需重新绑定事件——只要它们结构符合委托规则,就能立即响应。
对嵌套较深或存在中间包装元素的情况,推荐用 closest() 向上查找最近匹配的祖先元素:
e.target.closest('.item') 能命中 .item 本身,也能命中它内部任意子节点(如按钮、文字)parentNode 更简洁可靠事件委托不是万能的,需注意几点:
focus、
blur),可用 focusin/focusout 替代document 或 body 盲目委托,应尽量靠近目标元素,减少不必要的冒泡路径mousemove)慎用委托,可能增加判断开销;必要时加节流