事件冒泡是JavaScript中事件传播的默认行为,点击子元素时事件自动向上逐级触发父元素的同类型事件处理函数,无需额外操作;它从目标元素开始向上传播至document,但focus、blur等部分事件默认不冒泡。

事件冒泡是 JavaScript 中事件传播的默认行为之一,**不需要额外操作就能自动发生**——只要没被中途阻止,点击子元素时,事件会按 DOM 树向上逐级触发父元素的相同类型事件处理函数。
冒泡阶段如何自然发生
当你给一个子元素和它的父元素都绑定同类型事件(比如 click),点击子元素时,浏览器会先执行子元素的事件处理器,再执行父元素的——这就是冒泡阶段的体现。它由浏览器原生支持,无需手动“开启”或“启动”。
- 冒泡从目标元素(最深的触发节点)开始,依次向上传递到
document(或window) - 所有中间祖先元素,只要绑定了该事件类型且未被阻止,都会收到事件
- 注意:不是所有事件都冒泡(如
focus、blur、mouseenter、mouseleave默认不冒泡)
确保冒泡正常工作的关键点
有时你以为冒泡失效了,其实是因为被意外阻止了。检查以下常见情况:
-
没调用
event.stopPropagation()或event.stopImmediatePropagation() -
没在事件处理函数中返回
false(仅对用onxxx属性绑定的事件有效,不推荐) -
事件监听器用了
{ capture: true }—— 这会让监听器在捕获阶段执行,但不影响冒泡本身;若同时有多个监听器,注意执行顺序
一个简单示例
HTML 结构:
立即学习“Java免费学习笔记(深入)”;
JS 绑定:
document.getElementById('child').addEventListener('click', () => console.log('按钮被点了'));document.getElementById('parent').addEventListener('click', () => console.log('父 div 被点了'));
点击按钮后,控制台会依次输出:按钮被点了父 div 被点了
这说明冒泡已生效。
想阻止冒泡?反向操作即可
如果某次你**不想**让事件冒泡,才需要主动干预:
- 在事件处理函数中调用
event.stopPropagation() - 或者用
event.cancelBubble = true(旧版 IE 兼容写法,现代环境不需)
不调用这些方法,冒泡就一直存在。


















