在 javascript 中,addeventlistener 的第三个参数用于控制事件流的方向。该参数可以是一个布尔值(true 表示捕获阶段,false 表示冒泡阶段),也可以是一个包含 capture、once 和 passive 属性的对象。默认情况下,该值为 false,即事件在冒泡阶段触发。

使用布尔值设置捕获或冒泡
当第三个参数为布尔值时,true 启用捕获模式,false 启用冒泡模式。捕获模式从根节点向下传播到目标节点,而冒泡模式从目标节点向上传播到根节点。

<div id="parent">
<button id="child">Click me</button>
</div>
<script>
document.getElementById('parent').addEventListener('click', function() {
console.log('Parent captured');
}, true);
document.getElementById('child').addEventListener('click', function() {
console.log('Child bubbled');
});
</script>
在上述代码中,点击按钮会先输出 "Parent captured",然后输出 "Child bubbled"。这是因为父元素使用了捕获模式,子元素使用了默认的冒泡模式。
使用对象配置高级选项
除了布尔值,还可以传递一个对象来配置更复杂的选项。对象中的 capture 属性与布尔值作用相同,once 属性确保事件监听器只触发一次,passive 属性告知浏览器该监听器不会调用 preventDefault(),从而优化滚动性能。

document.getElementById('child').addEventListener('click', function() {
console.log('Child clicked once');
}, { capture: false, once: true, passive: true });
这段代码注册了一个只触发一次的点击事件监听器,且不会阻止默认行为。这对于提升页面滚动性能非常有用。
如何移除已注册的捕获事件监听器
要移除使用捕获模式注册的事件监听器,必须使用相同的参数调用 removeEventListener。如果当初注册时使用了 true,那么移除时也必须传入 true,否则无法成功移除。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











