当addEventListener的第三个参数为true时,事件监听器在捕获阶段触发;为false(默认)则在冒泡阶段触发。DOM事件流分捕获、目标、冒泡三阶段,capture参数决定监听阶段:true绑定捕获(window→目标),false绑定冒泡(目标→window);现代写法支持{capture:true}等配置;捕获阶段可调用stopPropagation或stopImmediatePropagation中断流程,典型应用包括全局快捷键、权限校验和点击外部关闭。

当设置 addEventListener 的第三个参数为 true 时,事件监听器会在捕获阶段触发;设为 false(默认)则在冒泡阶段触发。
capture 参数的作用本质
DOM 事件流分为三个阶段:捕获阶段 → 目标阶段 → 冒泡阶段。capture 参数决定监听器绑定在哪个阶段生效:
-
true:监听器注册到捕获阶段,从
window开始,逐层向下经过祖先元素,到达目标元素前触发 -
false(或省略):监听器注册到冒泡阶段,从目标元素开始,逐层向上传递到
window时触发 - 现代写法也可传入配置对象,如
{ capture: true },更清晰且支持其他选项(如once、passive)
捕获阶段的实际触发顺序
假设 HTML 结构为:<div id="outer"><div id="inner">点击我</div></div>,并为两者都添加捕获监听器:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 点击
#inner时,事件先从window→document→#outer→#inner - 所以
#outer的捕获监听器会先于#inner的捕获监听器执行 - 注意:目标阶段(即事件到达
#inner本身)对捕获和冒泡监听器都有效,但捕获监听器仍按捕获顺序触发
如何主动中断捕获流程
在捕获阶段中,可通过以下方式控制事件传递:
立即学习“Java免费学习笔记(深入)”;
- 调用
event.stopPropagation():阻止事件继续向深层元素传播(也阻止后续的冒泡) - 调用
event.stopImmediatePropagation():不仅阻止传播,还阻止同一阶段其他监听器执行 - 注意:
event.cancelBubble = true对捕获阶段无效,它只影响冒泡阶段
捕获阶段的典型应用场景
捕获模式适合需要“提前拦截”的逻辑:
- 全局快捷键监听(如按下 Ctrl+S 触发保存),在
document捕获阶段监听,避免被子元素的stopPropagation阻断 - 权限或条件校验(如判断用户是否登录),在根容器捕获阶段统一处理,早于业务组件响应
- 外层容器实现“点击外部关闭”功能,利用捕获监听快速识别目标是否在内部区域之外

















