A1. 要素 (核心零件)

  • 事件源 (Event Target): 真正被点击的那个最小元素。
  • 传播路径 (Path): Window > … > Parent > Target。
  • 监听器 (Listener): element.addEventListener('click', fn, useCapture)
    • 第三个参数是关键:false (默认) 监听冒泡;true 监听捕获。

A2. 结构 (三阶段) 标准事件流(W3C标准)必然遵循以下顺序:

  1. 捕获 (Capturing): 从外向内。目的在于让父级元素有机会在子级元素之前处理事件。
  2. 目标 (Target): 到达源头。
  3. 冒泡 (Bubbling): 从内向外。这是我们最常利用的阶段。

A3. 系统 (涌现功能) 这套双向机制涌现出了一个极其重要的设计模式:事件委托 (Event Delegation)。 既然所有子元素的事件最终都会“冒泡”给父元素,那我们完全没必要给 1000 个子元素都绑定监听器,只需要给父元素绑定 1 个监听器就够了。

阻止事件流 有时候我们不希望事件继续传播(比如防止点击子按钮触发父组件的跳转):

  • event.stopPropagation():
    • 切断后续传播。如果在捕获阶段调用,事件就不再往下传;如果在冒泡阶段调用,事件就不再往上传,如果传到有监听捕获/冒泡的其他事件的dom元素,还是会执行,只不过不继续传播到子元素/父元素了
  • event.stopImmediatePropagation():
    • 比上面更狠。如果一个元素绑定了多个 click 事件,stopPropagation 只能阻止事件传给父级,但当前元素剩下的 click 监听器还会执行。而这个方法会把当前元素剩下的监听器也全部杀掉。
  1. 纵向传播:事件在不同 DOM 节点之间传递(冒泡传给父级,捕获传给子级)。
  2. 横向执行:同一个 DOM 节点上,绑定了多个 click 监听函数。

reference

https://www.youtube.com/watch?v=XF1_MlZ5l6M