在JavaScript / HTML中,事件监听的捕获和冒泡阶段解析

在 JavaScript 中,事件传播分为三个阶段:捕获阶段(Capture Phase)目标阶段(Target Phase)冒泡阶段(Bubble Phase)addEventListener 的第三个参数可以控制事件监听器是在捕获阶段还是冒泡阶段触发。

1. 捕获阶段(Capture Phase)

  • 从外向内传播 :事件从最外层的祖先元素(window)向下逐级传递到目标元素。
  • 监听方式 :将 addEventListener 的第三个参数设为 true{ capture: true }
  • 特点:先执行捕获阶段的监听器,再执行目标阶段的事件,最后执行冒泡阶段的监听器。

2. 冒泡阶段(Bubble Phase)

  • 从内向外传播:事件从目标元素向上逐级传递到最外层的祖先元素。
  • 默认行为 :如果 addEventListener 的第三个参数未设置或设为 false/{ capture: false },监听器会在冒泡阶段触发。
  • 特点 :大多数事件默认支持冒泡(如 click),但少数事件(如 focus)不冒泡。

区别总结

特征 捕获阶段 冒泡阶段
传播方向 外层 → 目标元素(向下) 目标元素 → 外层(向上)
addEventListener 第三个参数设为 true 第三个参数为 false(默认)
执行顺序 先于冒泡阶段 后于捕获阶段
常见用途 提前拦截事件(如权限检查) 常规事件处理(如委托)

代码示例

html 复制代码
<div id="parent">
  <div id="child">点击我</div>
</div>

<script>
  const parent = document.getElementById('parent');
  const child = document.getElementById('child');

  // 捕获阶段监听(第三个参数为 true)
  parent.addEventListener('click', () => {
    console.log('父元素 - 捕获阶段');
  }, true);

  // 冒泡阶段监听(默认)
  parent.addEventListener('click', () => {
    console.log('父元素 - 冒泡阶段');
  });

  child.addEventListener('click', () => {
    console.log('子元素 - 目标阶段');
  });
</script>

输出结果(点击子元素时):

复制代码
父元素 - 捕获阶段
子元素 - 目标阶段
父元素 - 冒泡阶段

应用场景

  1. 事件委托(冒泡阶段)
    通过父元素监听子元素的事件(如动态生成的列表项)。
  2. 拦截操作(捕获阶段)
    在事件到达目标前进行拦截(如权限验证、阻止默认行为)。

注意事项

  • 使用 event.stopPropagation() 可阻止事件继续传播(捕获或冒泡)。
  • 目标元素的事件监听器(如 child)在目标阶段触发,与第三个参数无关。
相关推荐
AI即插即用15 小时前
即插即用系列(代码实践)专栏介绍
开发语言·人工智能·深度学习·计算机视觉
码农水水15 小时前
蚂蚁Java面试被问:混沌工程在分布式系统中的应用
java·linux·开发语言·面试·职场和发展·php
喵了meme15 小时前
c语言经验分享
c语言·开发语言
Knight_AL15 小时前
用 JOL 验证 synchronized 的锁升级过程(偏向锁 → 轻量级锁 → 重量级锁)
开发语言·jvm·c#
啊阿狸不会拉杆16 小时前
《数字图像处理》第 4 章 - 频域滤波
开发语言·python·数字信号处理·数字图像处理·频率域滤波
江沉晚呤时16 小时前
从零实现 C# 插件系统:轻松扩展应用功能
java·开发语言·microsoft·c#
Knight_AL16 小时前
Java 多态详解:概念、实现机制与实践应用
java·开发语言
Omigeq16 小时前
1.2.1 - 图搜索算法(以A*为例) - Python运动规划库教程(Python Motion Planning)
开发语言·python·机器人·图搜索算法
资深流水灯工程师17 小时前
基于Python的Qt开发之Pyside6 串口接收数据被分割的解决方案
开发语言·python·qt
没有bug.的程序员17 小时前
Java 并发容器深度剖析:ConcurrentHashMap 源码解析与性能优化
java·开发语言·性能优化·并发·源码解析·并发容器