capture参数控制事件监听器在捕获阶段(true)或冒泡阶段(false,默认)触发,使监听器分别在事件从document向下传递或从目标向上冒泡时执行。

在 JavaScript 中,通过 addEventListener 的第三个参数传入 true,就能开启捕获阶段的事件监听。
capture 参数的作用是什么
DOM 事件流分为三个阶段:捕获阶段 → 目标阶段 → 冒泡阶段。默认情况下,addEventListener 只在冒泡阶段触发(即第三个参数为 false 或省略)。设为 true 后,监听器会在捕获阶段被调用——也就是事件从 document 开始向下传递、到达目标元素之前的路径上触发。
如何写一个捕获阶段的监听器
语法很简单,只需把第三个参数设为 true:
element.addEventListener('click', handler, true);
常见写法还有使用选项对象形式(更推荐,语义清晰):
element.addEventListener('click', handler, { capture: true });
- 两种写法效果一致,但对象写法支持更多配置(如
once、passive) - 如果同时在父元素和子元素上绑定捕获监听器,父元素的会先执行(因为捕获是从外向内)
- 注意:同一个元素上,不能仅靠
capture值区分重复监听器;移除时也要传相同的参数(true或对应选项对象)
捕获 vs 冒泡的实际表现对比
假设有如下结构:
<div id="outer"> <div id="inner">点我</div> </div>
分别给 outer 和 inner 绑定点击监听器:
outer.addEventListener('click', () => console.log('outer 捕获'), true)inner.addEventListener('click', () => console.log('inner 捕获'), true)inner.addEventListener('click', () => console.log('inner 冒泡'), false)outer.addEventListener('click', () => console.log('outer 冒泡'), false)
点击 inner 时,控制台输出顺序是:
outer 捕获 → inner 捕获 → inner 冒泡 → outer 冒泡
什么时候该用捕获模式
捕获阶段适合需要“提前拦截”事件的场景:
- 全局快捷键处理(比如按 Esc 关闭模态框),在
document上用捕获监听,确保不被子元素的stopPropagation()阻断 - 组件封装时,父组件想在事件到达子组件前统一处理(如权限校验、日志记录)
- 实现自定义事件委托:在父容器用捕获监听,再根据
event.target判断真实触发源
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











