事件代理
利用事件冒泡机制,将子元素的事件委托给父元素处理
问题
什么是事件代理(Event Delegation)?
解答
事件代理也称为事件委托,是把原本需要绑定在子元素的事件委托给父元素,让父元素负责监听和处理。
原理
事件代理基于 DOM 事件冒泡机制。事件触发后会在元素间传播,分为三个阶段:
- 捕获阶段:从 window 对象传导到目标节点,不响应事件
- 目标阶段:在目标节点上触发
- 冒泡阶段:从目标节点传导回 window 对象,事件代理利用这个阶段
示例
比如在 ul 上代理所有 li 的点击事件:
<ul id="list">
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
</ul>
const list = document.getElementById('list');
list.addEventListener('click', function(e) {
if (e.target.tagName === 'LI') {
console.log('点击了:', e.target.textContent);
}
});
优点
节省内存:不需要给每个 li 都绑定事件,只在父元素 ul 上绑定一次,大幅减少事件注册数量。
动态绑定:通过 AJAX 或用户操作动态增删 li 元素时,无需重新绑定或解绑事件。事件绑定在父元素上,执行时再匹配目标元素即可。
注意事项
不要盲目将事件委托给最顶层元素。事件冒泡需要耗时,DOM 嵌套越深,“事件传播链”越长,性能损耗越大。应选择合适的父元素进行委托。
关键点
- 基于事件冒泡机制,将子元素事件绑定到父元素上
- 减少内存占用,避免为每个子元素单独绑定事件
- 支持动态元素,新增或删除子元素无需重新绑定
- 选择合适的父元素,避免事件传播链过长影响性能
目录