stoppropagation用于阻止事件在当前阶段(捕获或冒泡)向父节点传播,不影响同节点同阶段其他监听器执行;与stopimmediatepropagation不同,后者还阻止本节点其余监听器运行。

stopPropagation 用于阻止事件继续向父元素传播,但它本身不区分冒泡还是捕获阶段——只要调用它,当前阶段(捕获或冒泡)的后续传播就会立即停止。
它在捕获和冒泡阶段都有效
无论事件当前处于捕获阶段还是冒泡阶段,只要在事件处理函数中调用了 event.stopPropagation(),该事件就不会再传递给当前节点的祖先节点(捕获阶段)或后代/兄弟节点之后的祖先节点(冒泡阶段)。
例如:
<div id="outer">
<div id="inner">点击我</div>
</div>
<script>
const outer = document.getElementById('outer');
const inner = document.getElementById('inner');
// 捕获阶段监听(第三个参数 true)
outer.addEventListener('click', () => {
console.log('outer 捕获');
}, true);
inner.addEventListener('click', (e) => {
console.log('inner 冒泡');
e.stopPropagation(); // 阻止继续向上冒泡
});
outer.addEventListener('click', () => {
console.log('outer 冒泡');
});
</script>
点击 inner 时,输出是:
→ outer 捕获(捕获阶段正常触发)
→ inner 冒泡(目标阶段触发)
→ outer 冒泡不会执行(因为 stopPropagation 在 inner 中调用,阻断了冒泡)
它不影响同一阶段的其他监听器
stopPropagation 不会阻止当前节点上其他同阶段、同事件类型的监听器执行。它只影响“向上传播”这个行为。
- 如果多个事件监听器绑定在同一元素、同一阶段(比如都设为冒泡),它们仍会依次执行
- 只有传播路径上的“下一个节点”(父或子)的监听器会被跳过
注意与 stopImmediatePropagation 的区别
stopPropagation 只阻止传播,不限制本节点其他监听器;stopImmediatePropagation 还会阻止同一节点上其余同类型监听器执行。
- 想只停传播 → 用 stopPropagation
- 想连本节点其他监听器也跳过 → 用 stopImmediatePropagation
捕获阶段中调用也生效
即使在捕获阶段调用,它同样会中断后续的捕获流程(不再进入更深层子节点),并同时阻止之后的冒泡阶段启动(因为事件流被提前终止)。
不过要注意:一旦在捕获阶段某节点上调用了 stopPropagation,事件将不会到达目标节点,也不会触发冒泡——所以目标节点和所有冒泡监听器都不会执行。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











