事件冒泡是事件从目标元素逐级向上传播至document的过程;点击嵌套按钮时,依次触发按钮、div、body和document的click处理函数;可用stopPropagation()阻止冒泡,preventDefault()阻止默认行为,stopImmediatePropagation()同时阻止冒泡和其他同类型监听器执行。
事件冒泡是 JavaScript 中事件传播的默认行为之一:当某个元素上的事件被触发时,该事件会先在目标元素上执行,然后逐级向上传播到其父元素、祖父元素,直至 document 根节点。
比如点击一个按钮,而这个按钮嵌套在 div 里,div 又在 body 中。点击按钮时,click 事件会按如下顺序触发:
这种“从内向外”的传播路径就是冒泡阶段(与之相对的是捕获阶段,从外向内)。大多数 DOM 事件默认支持冒泡,如 click、mousedown、keyup 等;但也有例外,比如 focus、blur、mouseenter、mouseleave 不冒泡。
使用事件对象的 stopPropagation() 方法可立即中断当前事件的后续传播路径,阻止它继续向上冒泡。
示例:
button.addEventListener('click', function(e) {
console.log('按钮被点击');
e.stopPropagation(); // 阻止冒泡
});
div.addEventListener('click', function() {
console.log('div 被点击'); // 这行不会执行
});
除了 stopPropagation,还有两个常用方法常被混淆,但作用不同:
如果想彻底禁用某事件的所有效果,有时需要同时调用 preventDefault() 和 stopPropagation()。
典型场景包括:
的关闭事件但不要滥用:过度阻止冒泡可能破坏组件间合理的事件协作,尤其在使用事件委托时。