javascript中addeventlistener的第三个参数控制事件阶段:布尔值true为捕获、false为冒泡;对象参数支持capture、once、passive等选项;捕获与冒泡共存时按“捕获→目标→冒泡”顺序执行,可用stoppropagation或stopimmediatepropagation中断传播。

在 JavaScript 中,通过 addEventListener 的第三个参数(options)可以明确指定事件监听器在捕获阶段还是冒泡阶段触发。默认是冒泡阶段,但你可以主动选择捕获阶段。
使用布尔值参数控制阶段
最常用的方式是传入一个布尔值:
- false(默认):监听器在冒泡阶段执行
- true:监听器在捕获阶段执行
示例:
element.addEventListener('click', handler, true); // 捕获阶段
element.addEventListener('click', handler, false); // 冒泡阶段(可省略)
使用 options 对象更精细地控制
现代写法推荐使用配置对象,支持更多选项:
- capture: true → 捕获阶段
- capture: false → 冒泡阶段(默认)
- once: true → 只触发一次
-
passive: true → 告诉浏览器不会调用
preventDefault()(常用于滚动优化)
示例:
element.addEventListener('click', handler, { capture: true });
element.addEventListener('scroll', handler, { passive: true, capture: false });
捕获与冒泡共存时的执行顺序
如果父元素和子元素都添加了监听器,且分别设为捕获和冒泡,完整流程是:
- 从外到内:所有 捕获阶段 监听器依次执行(父 → 子)
- 到达目标:目标元素上的监听器(无论
capture设为 true 还是 false,都会触发) - 从内到外:所有 冒泡阶段 监听器依次执行(子 → 父)
注意:目标元素上同时绑定捕获和冒泡监听器时,按添加顺序执行(先加的先运行)。
如何中途停止传播
若想阻止后续阶段执行,可用:
-
event.stopPropagation():阻止事件继续向上传播(不影响同阶段其他监听器) -
event.stopImmediatePropagation():阻止当前阶段其余监听器 + 后续阶段
这两个方法在捕获或冒泡阶段中都有效,但不会影响已执行过的监听器。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











