【JS】事件捕获和事件冒泡的区别

事件捕获和事件冒泡是指在 DOM 树中处理事件时的两种不同的传播方式。它们之间的主要区别在于事件传播的方向和顺序:

事件捕获(Capture)

  • 方向: 从最外层的祖先元素向目标元素传播。
  • 顺序: 事件首先从最外层的祖先元素开始传播,直到达到目标元素。
  • 应用场景: 可以在捕获阶段对事件进行拦截或预处理。

事件冒泡(Bubble)

  • 方向: 从目标元素向最外层的祖先元素传播。
  • 顺序: 事件从目标元素开始向上冒泡,直到达到最外层的祖先元素。
  • 应用场景: 可以在冒泡阶段对事件进行响应或处理。

区别总结:

  • 方向不同: 捕获是从外向内,冒泡是从内向外。
  • 应用不同: 捕获通常用于预处理或拦截事件,而冒泡通常用于响应或处理事件。

事件传播的三个阶段:

  1. 捕获阶段(Capture Phase): 事件从最外层的祖先元素向目标元素传播。
  2. 目标阶段(Target Phase): 事件到达目标元素。
  3. 冒泡阶段(Bubble Phase): 事件从目标元素向最外层的祖先元素传播。

在实际开发中,你可以根据需要选择在捕获阶段或冒泡阶段处理事件,利用这两种传播方式来实现不同的交互效果和逻辑。

我们可以用addEventListener 的第三个参数capture的取值,形象地看事件捕获和冒泡的区别。capture(布尔值,表示事件是否在捕获阶段触发,默认为false

以下是冒泡的示例,由内向外

在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Simple HTML Project</title><style>body {font-family: Arial, sans-serif;text-align: center;}#parent {background-color: #9fc882;padding: 20px;border: 2px solid #73deaf;}#child {background-color: #c8f0d9;padding: 10px;margin-top: 10px;border: 1px solid #a4e1a5;}</style>
</head><body><h1>Welcome to My Simple HTML Project</h1><div id="parent">Parent Element<div id="child">Child Element</div></div><script>const parent = document.getElementById('parent');const child = document.getElementById('child');// 事件捕获阶段(useCapture 为 true)// parent.addEventListener('click', () => {//     console.log('Parent Element Clicked - Capture Phase');// }, true);// child.addEventListener('click', () => {//     console.log('Child Element Clicked - Capture Phase');// }, true);// 事件冒泡阶段(useCapture 为 false 或省略)parent.addEventListener('click', () => {console.log('Parent Element Clicked - Bubble Phase');});child.addEventListener('click', () => {console.log('Child Element Clicked - Bubble Phase');});</script>
</body></html>

这是捕获的示例,由外想内

在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Simple HTML Project</title><style>body {font-family: Arial, sans-serif;text-align: center;}#parent {background-color: #9fc882;padding: 20px;border: 2px solid #73deaf;}#child {background-color: #c8f0d9;padding: 10px;margin-top: 10px;border: 1px solid #a4e1a5;}</style>
</head><body><h1>Welcome to My Simple HTML Project</h1><div id="parent">Parent Element<div id="child">Child Element</div></div><script>const parent = document.getElementById('parent');const child = document.getElementById('child');// 事件捕获阶段(useCapture 为 true)parent.addEventListener('click', () => {console.log('Parent Element Clicked - Capture Phase');}, true);child.addEventListener('click', () => {console.log('Child Element Clicked - Capture Phase');}, true);// 事件冒泡阶段(useCapture 为 false 或省略)// parent.addEventListener('click', () => {//     console.log('Parent Element Clicked - Bubble Phase');// });// child.addEventListener('click', () => {//     console.log('Child Element Clicked - Bubble Phase');// });</script>
</body></html>

应用场景示例:

1. 事件代理(Event Delegation)
  • 场景描述: 在一个列表中有多个子项,需要为每个子项添加点击事件监听器。
  • 应用方式:
    • 使用事件冒泡机制,在整个列表的父元素上添加一个点击事件监听器。
    • 在监听器中通过事件对象的 target 属性判断用户点击了哪个子项。
<ul id="myList"><li>Item 1</li><li>Item 2</li><li>Item 3</li>
</ul><script>
const list = document.getElementById('myList');list.addEventListener('click', (event) => {if (event.target.tagName === 'LI') {console.log('Clicked on:', event.target.textContent);}
});
</script>
2. 表单验证
  • 场景描述: 在表单提交前需要对表单字段进行验证。
  • 应用方式:
    • 在表单的父元素上添加一个 submit 事件监听器,使用事件捕获阶段。
    • 在捕获阶段中进行表单字段的验证,如果验证不通过,阻止事件的默认行为(即阻止表单提交)。
<form id="myForm"><input type="text" id="username" placeholder="Username"><input type="password" id="password" placeholder="Password"><button type="submit">Submit</button>
</form><script>
const form = document.getElementById('myForm');form.addEventListener('submit', (event) => {// 模拟表单验证,这里只是简单示例if (!document.getElementById('username').value || !document.getElementById('password').value) {event.preventDefault(); // 阻止表单提交console.log('Please fill in all fields.');}
}, true); // 使用事件捕获阶段
</script>

这些示例展示了如何利用事件捕获和冒泡机制来解决实际的开发场景,提高代码的效率和可维护性。通过合理利用事件传播机制,可以简化事件处理逻辑,减少重复代码,并实现更灵活的交互。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/414980.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随机化 bbr probebw cycle phase

常打磨常新&#xff0c;bbr 和 inflight 守恒算法的模型和仿真也在不断优化。 再次给出 bbr 模型&#xff0c;这次修改了 d x d t \dfrac{dx}{dt} dtdx​ 的表达式&#xff0c;由 g 2 ⋅ x ⋅ r m i n g_2\cdot x\cdot r_{min} g2​⋅x⋅rmin​计算。同时加入了微观建模 pro…

5.注册中心的其他实现-Nacos

文章目录 1.Nacos简介2.Nacos的安装2.1Nacos Windows本地启动不成功&#xff1f;2.2Linux环境下载并启动 3. Nacos的使用4.Nacos的负载均衡5.Nacos 健康检查6.Nacos 环境隔离7.Nacos 配置中心7.1为什么需要配置中心7.2 Nacos配置中心使用7.3 Data id7.4Nacos 上Linux部署服务7.…

XSS LABS - Level 13 过关思路

关注这个靶场的其他相关笔记&#xff1a;XSS - LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 进入靶场&#xff0c;老样子&#xff0c;右击&#xff0c;查看页面源码&#xff0c;找找不同&#xff1a; 可以看到&#xff0c;本关又多了一个新字段 t_cook&#xf…

#C++ 笔记二

四、运算符重载 1.友元 1.1 概念 类实现了数据的隐藏和封装&#xff0c;类的数据成员一般定义为私有成员&#xff0c;仅能通过类的公有成员函数才能进行读写。 如果数据成员定义成公共的&#xff0c;则又破坏了封装性。但是在某些情况下&#xff0c;需要频繁的读写数据成员…

【Transformer】基本概述

文章目录 提出背景核心思想—注意力机制流程解析参考资料 提出背景 在Transformer模型出现之前&#xff0c;循环神经网络&#xff08;RNN&#xff09;及其变体&#xff0c;如长短期记忆网络&#xff08;LSTM&#xff09;和门控循环单元&#xff08;GRU&#xff09;&#xff0c;…

Ethercat设备数据 转IEC61850项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 5 设置网关采集ETHERCAT数据 5 6 用IEC61850协议转发数据 7 7 网关使用多个逻辑设备和逻辑节点的方法 9 8 安装NPCAP 10 9 案例总结 11 1 案例说明 设置网关采集EtherCAT设备数据把采集的数据转成IEC61850协议转发给其…

Ollydbg提示:xxxxxx可能不是一个 32 位 PE 文件,无论如何都尝试载入吗?

原标题&#xff1a;OD提示C:\Users\XuanRan\Desktop\xxxx.exe’可能不是一个个 32 位 PE 文件,无论如何都尝试载入吗? 它的意思就是告诉你&#xff0c;OD现在只能用于32位软件。 如果要调试64位程序&#xff0c;去使用x64dbg x64dbg下载链接&#xff1a; https://github.com…

记一次ssh伪终端修改为shell

问题 用户ssh进行连接后&#xff0c;默认为伪终端。 解决办法&#xff0c;可以先拿到终端shell&#xff0c;查看用户是否为/bin/bash&#xff1a; 不是/bin/bash&#xff0c;使用如下命令进行修改&#xff1a; chsh -s /bin/bash rootservice sshd restart

【WPF】WPF学习之【二】布局学习

WPF布局学习 常用布局Grid网格布局StackPanel 布局CanvasDockPanel布局WrapPanel布局 常用布局 1、StackPanel: 学习如何使用StackPanel进行垂直和水平布局。 2、Grid: 掌握Grid的网格布局技术。 3、Canvas: 了解Canvas的绝对定位布局。 4、DockPanel: 学习DockPanel的停靠…

计算机毕业设计选题推荐-茶园茶农文化交流平台-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

【Redis】Redis 主从复制

文章目录 1 前言2 主从模式介绍3 配置 Redis 主从结构3.1 建立复制3.2 断开复制3.3 其他特性3.4 拓扑结构 4 Redis 主从复制原理4.1 复制过程4.2 PSYNC 数据同步4.3 PSYNC 运行流程 5 主从复制流程5.1 全量复制流程5.2 部分复制流程5.3 实时复制流程 1 前言 分布式系统中存在一…

电路基础 ---- 负反馈放大电路的方框图分析法

1 方框图分析法 方框图如下&#xff1a; 图中 A u o A_{uo} Auo​是一个电压输入的放大器的放大倍数&#xff0c;称为开环放大倍数。 F F F为反馈系数&#xff0c;是一个矢量&#xff0c;是指输出信号 x o x_{o} xo​的多少倍回送到放大器的输入端。 M M M为衰减系数&#x…

新生开学分班用这个查询系统,1分钟即可制作同款系统

新学期已经开始了&#xff0c;老师们又要开始头疼分班的事情了。但别担心&#xff0c;现在有个超好用的查询系统&#xff0c;让分班变得简单又快速&#xff01; 在以前分班可麻烦了&#xff0c;老师们得一个个核对学生信息&#xff0c;还得通知家长。但现在&#xff0c;有了这…

VSCode + Git的常规操作(一)【描述详细直白,小白一学就会】

目录 一、文章简介 二、具体操作流程 1、操作前提 2、设置用户名、用户邮箱 &#xff08;1&#xff09;打开命令框 &#xff08;2&#xff09;配置用户名 &#xff08;3&#xff09;配置用户名邮箱 &#xff08;4&#xff09;查看配置 3、SSH密钥对的介绍、生成及配置…

软考计算机软件基础知识总结

目录 前言 计算机软件概述 操作系统 数据库 文件系统 网络协议 中间件 软件构件 应用软件 最后 前言 早期的计算机软件和计算机程序 (Computer Program) 的概念几乎不加区别&#xff0c;后来计算机 软件的概念在计算机程序的基础上得到了延伸。计算机软件是指计算机系…

HTTP 状态码:解析与处理的全面指南

一、HTTP 状态码概述 HTTP 状态码&#xff08;HTTP Status Code&#xff09;是用以表示网页服务器 HTTP 响应状态的 3 位数字代码。它在客户端与服务器之间的通信中起着至关重要的作用。 其主要作用在于向客户端清晰准确地传达服务器对请求的处理结果。例如&#xff0c;当客户…

ARCGIS 纸质小班XY坐标转电子要素面(2)

本章用于说明未知坐标系情况下如何正确将XY转要素面 背景说明 现有资料&#xff1a;清除大概位置&#xff0c;纸质小班图&#xff0c;图上有横纵坐标&#xff0c;并已知小班XY拐点坐标&#xff0c;但未知坐标系。需要上图 具体操作 大部分操作同这边文章ARCGIS 纸质小班XY…

SprinBoot+Vue餐厅点餐系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

使用docker容器部署考试系统

8.30 回顾 1、使用harbor仓库 python --version yum -y update yum -y install python2-pip 部署考试系统 使用docker部署project-exam-system 1、在一台主机内&#xff0c;实现容器的编排看&#xff0c;发布考试系统 2、环境准备 docker docker-compose docker脚本 …

C语言实现SHA-256算法校验文件(win32-API)

一、前言 在数字化时代&#xff0c;信息安全与数据完整性成为了不可忽视的关键议题。在众多保障数据完整性的方法中&#xff0c;散列函数扮演着至关重要的角色。SHA-256&#xff08;Secure Hash Algorithm 256&#xff09;作为一种先进的散列算法&#xff0c;以其高度的安全性…