A1. 要素 (核心零件)
- 事件源 (Event Target): 真正被点击的那个最小元素。
- 传播路径 (Path): Window ←> … ←> Parent ←> Target。
- 监听器 (Listener):
element.addEventListener('click', fn, useCapture)- 第三个参数是关键:
false(默认) 监听冒泡;true监听捕获。
- 第三个参数是关键:
A2. 结构 (三阶段) 标准事件流(W3C标准)必然遵循以下顺序:
- 捕获 (Capturing): 从外向内。目的在于让父级元素有机会在子级元素之前处理事件。
- 目标 (Target): 到达源头。
- 冒泡 (Bubbling): 从内向外。这是我们最常利用的阶段。
A3. 系统 (涌现功能) 这套双向机制涌现出了一个极其重要的设计模式:事件委托 (Event Delegation)。 既然所有子元素的事件最终都会“冒泡”给父元素,那我们完全没必要给 1000 个子元素都绑定监听器,只需要给父元素绑定 1 个监听器就够了。
阻止事件流 有时候我们不希望事件继续传播(比如防止点击子按钮触发父组件的跳转):
event.stopPropagation():- 切断后续传播。如果在捕获阶段调用,事件就不再往下传;如果在冒泡阶段调用,事件就不再往上传,如果传到有监听捕获/冒泡的其他事件的dom元素,还是会执行,只不过不继续传播到子元素/父元素了
event.stopImmediatePropagation():- 比上面更狠。如果一个元素绑定了多个 click 事件,
stopPropagation只能阻止事件传给父级,但当前元素剩下的 click 监听器还会执行。而这个方法会把当前元素剩下的监听器也全部杀掉。
- 比上面更狠。如果一个元素绑定了多个 click 事件,
- 纵向传播:事件在不同 DOM 节点之间传递(冒泡传给父级,捕获传给子级)。
- 横向执行:同一个 DOM 节点上,绑定了多个
click监听函数。