JavaScript 事件传播机制详解:捕获、目标与冒泡
本文详细解析 JavaScript 中事件的默认传播机制,涵盖捕获阶段、目标阶段和冒泡阶段三个核心过程。通过 HTML 嵌套元素示例与 addEventListener 第三个参数(useCapture)的代码演示,说明事件如何从外向内捕获、在目标节点处理以及从内向外冒泡,帮助开发者深入理解事件流并优化交互逻辑。
JavaScript 事件传播机制概述
在 JavaScript 中,事件发生时会遵循一套默认的传播机制,该机制决定了事件在 DOM 树中的传递路径。
第一阶段为捕获阶段(Capturing Phase)。事件从最外层的文档根节点开始,依次向内层查找并触发绑定了捕获阶段监听器的元素,直到到达目标节点的上层父元素。
第二阶段为目标阶段(Target Phase)。此时事件到达最初触发事件的元素,即当前事件源。在此阶段,会执行绑定在该目标元素上的事件处理程序,无论该监听器是注册在捕获阶段还是冒泡阶段。
第三阶段为冒泡阶段(Bubbling Phase)。事件从目标元素开始,由内向外依次向父级元素传递,触发各层父元素上绑定的冒泡阶段监听器。这是开发者日常开发中最常利用和遇到的阶段,因为大多数默认事件监听器都注册在冒泡阶段。
具体的传播路径与层级关系可参考下方的示意图,图中展示了嵌套元素间的事件流向。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
#outer{
margin:20px auto;
padding:20px;
width:300px;
height:300px;
background:#008000;
}
#inner{
padding:20px;
width:200px;
height:200px;
background:blue;
}
#center{
padding:20px;
width:100px;
height:100px;
background:yellow;
}
</style>
</head>
<body>
<div id='outer'>
<div id='inner'>
<div id='center'></div>
</div>
</div>
<script>
var outer = document.getElementById('outer'),inner = document.getElementById('inner'),center = document.getElementById('center');
//使用DOM0级事件绑定给元素的某一个行为绑定的方法,都是在行为触发后的冒泡阶段把方法执行的
document.body.onclick = function(){
console.log('body')
}
outer.onclick = function(){
console.log('outer')
}
inner.onclick = function(){
console.log('inner')
}
center.onclick = function(){
console.log('center')
}
//addEventListener 第一个参数是行为的类型 第二个参数是给当前的行为定义的方法 第三个参数是控制在哪个阶段发生:true 在捕获阶段发生 false在冒泡阶段发生
document.body.addEventListener('click',function(){
console.log('body')
},false)
outer.addEventListener('click',function(){
console.log('outer')
},true)
inner.addEventListener('click',function(){
console.log('inner')
},false)
//输出 outer inner body
</script>
</body>
</html>
以上内容完整介绍了 JavaScript 事件传播机制的核心概念与实例分析,旨在为读者提供清晰的参考。欢迎收藏与分享,以支持本站持续更新更多技术内容。
JS在setTimeout或Ajax回调中打开新标签页失败怎么处理
2026-11-05 15:50:12
JS直播协议选型:HLS、FLV与WebRTC的延迟与兼容性对比
2026-11-05 12:16:14
JS实现回到顶部:scrollTop赋值与浏览器兼容性处理
2026-11-04 23:43:35
JS使用classList动态添加、移除和切换CSS类名
2026-11-04 23:40:58
在 D3.js 中实现平滑过渡动画的技巧
2026-11-03 23:46:09
