js事件流的三个阶段是捕获阶段、目标阶段、冒泡阶段:捕获阶段从window/document向下传递至目标父级,目标阶段在触发元素上执行监听器,冒泡阶段从目标元素向上传播至根节点。

JS 中事件流的三个阶段是:捕获阶段、目标阶段、冒泡阶段。它们描述了一个事件(比如点击)在 DOM 树中传播的完整路径,不是“只发生在某个元素上”,而是按固定顺序经过多个节点。
捕获阶段:从外向内“探路”
事件从最顶层的 document(或 window)开始,逐层向下传递,依次经过 、、父容器等,直到抵达**目标元素的父级**——但不触发目标元素本身的捕获监听器(W3C标准如此,不过现代浏览器大多也会在捕获阶段执行目标元素上的监听器)。
你可以把它理解为“提前通知沿途上级:马上要出事了”。这个阶段适合做全局拦截,比如权限校验、日志埋点,但日常开发中较少直接使用。
- 绑定方式:
addEventListener('click', handler, true) - 执行顺序:外层元素先于内层元素
- 典型用途:不干扰目标行为的前提下预处理事件
目标阶段:事件真正“落地”
事件到达你实际点击(或触发)的那个元素,比如一个 <button></button> 或 <li>。此时会执行该元素上绑定的所有监听器(无论捕获还是冒泡模式,现代浏览器都支持在目标阶段触发)。
这是唯一一个“精准命中”的阶段,也是开发者最常关注的环节。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
冒泡阶段:从内向外“上报”
事件从目标元素开始,逐层向上传递,经过父级、祖父级,最终回到 document。这是默认行为,也是最常用、最实用的阶段。
就像水底冒出的气泡,越往上越明显——子元素的事件自然影响到父容器,这正是事件委托的基础。
- 绑定方式:
addEventListener('click', handler)或addEventListener('click', handler, false) - 执行顺序:目标元素最先,祖先元素依次跟进
- 典型用途:事件委托、统一处理动态生成的子元素
怎么直观区分捕获和冒泡?
假设结构是:<div id="A"><div id="B"><button id="C">点我</button></div></div>
给 A、B、C 都绑 click 监听器:
- 全设为捕获(
true)→ 输出顺序:A → B → C - 全设为冒泡(
false或省略)→ 输出顺序:C → B → A - 混用时:捕获先走完(A→B→C),再进目标(C),最后冒泡上浮(C→B→A)
注意:focus、blur、scroll 等少数事件不冒泡,但 click、input、keydown 等绝大多数用户交互事件都支持完整三阶段。










