当前位置: 首页 > news >正文

DOM 事件的处理通常分为三个阶段:捕获、目标、冒泡【前端示例】

如果神明还不帮你,说明他相信你。

目录

  • 引言:
  • 捕获阶段:
  • 目标阶段:
  • 冒泡阶段:
  • 事件传播示意图:
  • 示例:
    • 代码:
    • 解读:
    • 输出:

引言:

DOM 事件的处理通常分为三个阶段:捕获阶段、目标阶段和冒泡阶段。这三个阶段描述了事件在 DOM 树中传播的顺序。

捕获阶段:

在捕获阶段,事件从 document 开始向下传播,逐层向下到达事件目标(即触发事件的元素)。在这个阶段,事件会经过所有的祖先元素,直到到达目标元素。

  • 顺序:document → html → body → 目标元素
  • 事件监听:可以在任何祖先元素上设置事件监听器,使用 { capture: true } 选项来监听捕获阶段的事件。

目标阶段:

在目标阶段,事件到达目标元素,事件处理程序在这个元素上被执行。此时,事件处理程序可以访问事件对象,获取有关事件的信息。

  • 顺序:目标元素
  • 事件监听:在目标元素上设置的事件监听器会在这个阶段被调用。

冒泡阶段:

在冒泡阶段,事件从目标元素开始向上冒泡,逐层返回到 document。在这个阶段,事件会经过所有的祖先元素,直到到达 document。

  • 顺序:目标元素 → body → html → document
  • 事件监听:可以在任何祖先元素上设置事件监听器,默认情况下,事件监听器会在冒泡阶段被调用。

事件传播示意图:

  • 捕获阶段:document -> html -> body -> target (目标元素)
  • 目标阶段:target (目标元素)
  • 冒泡阶段:target (目标元素) -> body -> html -> document

示例:

代码:

以下是一个简单的示例,展示了如何在捕获和冒泡阶段设置事件监听器:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Event Phases Example</title>
</head>
<body><div id="parent" style="padding: 20px; border: 1px solid black;">Parent<button id="child">Click Me</button></div><script>const parent = document.getElementById('parent');const child = document.getElementById('child');// 捕获阶段的事件监听器parent.addEventListener('click', () => {console.log('Parent (capturing)');}, { capture: true });// 目标阶段的事件监听器child.addEventListener('click', () => {console.log('Child (target)');});// 冒泡阶段的事件监听器parent.addEventListener('click', () => {console.log('Parent (bubbling)');});</script>
</body>
</html>

解读:

当用户点击 “Click Me” 按钮时,事件传播的过程如下:

  • 捕获阶段:事件从 document 开始向下传播,经过 parent 元素。捕获阶段的监听器被调用,输出:Parent (capturing)
  • 目标阶段:事件到达 child 元素(按钮)。目标阶段的监听器被调用,输出:Child (target)
  • 冒泡阶段:事件从 child 元素开始向上冒泡,经过 parent 元素。冒泡阶段的监听器被调用,输出:Parent (bubbling)

输出:

Parent (capturing)
Child (target)
Parent (bubbling)

相关文章:

  • 1.2 点云数据获取方式——激光雷达
  • 大模型——使用coze搭建基于DeepSeek大模型的智能体实现智能客服问答
  • 2025.4.29总结
  • SuperMap GIS基础产品FAQ集锦(20250429)
  • 为什么 Vite 速度比 Webpack 快?
  • AI工具的应用体验---------一键生成个人的微信名片
  • Cursor:AI时代的智能编辑器
  • TA学习之路——2.3图形的HLSL常用函数详解
  • Git常用指令速查
  • Post与Get以及@Requestbody和@Pathvariable标签的应用
  • 使用Docker操作MySQL
  • JavaScript 中的类型转换机制?
  • 高级项目管理
  • iVX 引领软件开发进入 “可视化逻辑时代”
  • 深入学习解读:《数据安全技术 数据分类分级规则》【附全文阅读】
  • 语言特性的发展与应用:从基础到前沿的全面解析
  • [C++]C++20协程的原理
  • Java基础 4.29
  • 【18】爬虫神器 Pyppeteer 的使用
  • Mysql存储引擎、锁机制
  • A股三大股指涨跌互现:3343股收涨,两市成交超1.1万亿元
  • 年轻人的事业!6家上海人工智能企业畅想“模范生”新征程
  • 量子传感新技术“攻克”退相干难题
  • 朝鲜新型驱逐舰“崔贤”号进行多项武器试验
  • 上海科创的三种品格
  • A股三大股指小幅低收:电力股大幅调整,两市成交10221亿元