事件委托、事件捕获与事件冒泡
原理解释
事件委托
将目标元素的事件注册在父元素上, 而不是直接绑定在每个子元素上
优势
- 减少内存消耗, 因为不需要给每个子元素都绑定事件监听器
- 动态添加的子元素无需重新绑定事件, 事件委托仍然生效
- 便于统一管理事件逻辑
事件捕获与事件冒泡
事件捕获(capturing)与事件冒泡(bubbling)这两个阶段加上目标本身的处理过程, 合起来叫事件传播机制(event propagation)
当事件被触发时, 浏览器会创建一个对应的事件对象
浏览器处理事件的过程可以分为三个阶段:
捕获阶段
事件对象从祖先元素沿着 DOM 树向下传递, 触发沿途元素上以捕获方式注册的事件监听器, 直到达到目标元素的父节点
目标阶段
事件到达目标元素本身, 触发目标元素上以捕获和冒泡方式注册的事件监听器
冒泡阶段
事件对象从目标元素开始, 沿着 DOM 树向上传递, 触发沿途元素上以冒泡方式注册的事件监听器
禁止事件传播与默认行为
- 监听器第三个参数
caption
控制事件在哪个阶段触发:
element.addEventListener('click', handler, { capture: true }) // 捕获阶段触发
element.addEventListener('click', handler, { capture: false }) // 冒泡阶段触发(默认)
- 阻止事件继续传播(阻止捕获和冒泡):
event.stopPropagation()
- 阻止事件的默认行为:
event.preventDefault()
事件委托机制示例
See the Pen Untitled by 脑冻 (@noodlefreeze) on CodePen.