JavaScript事件冒泡和捕获

🧑‍🎓 个人主页:《爱蹦跶的大A阿》

🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》

​ 

✨ 前言

        事件传播是JavaScript中非常重要的一个概念,它描述了从嵌套元素到祖先元素的事件传播顺序。本文将详细介绍事件传播的两种主要模式:冒泡传播和捕获传播。

        理解事件传播对编写事件处理函数非常重要,它可以帮助我们控制事件触发的顺序,实现事件代理等技巧。通过本文,你将深入了解事件在DOM中的传播规则,并能够根据实际需求选择合适的事件传播方式。

✨ 正文

事件传播描述从嵌套元素到父级元素的顺序,主要有两种模式:冒泡传播捕获传播

冒泡传播

冒泡传播 meanspropagation from the target element straight up to DOM root.

例如点击嵌套的标签时:

<div><em>Click me!</em>
</div>
  1. 点击 <em> 会首先触发 <em> 上的处理程序。
  2. 然后事件会冒泡到 <div>
  3. 再冒泡到 <body> 等直到 document 对象。
// 添加事件处理程序
em.onclick = e => alert("Em");
div.onclick = e => alert("Div");// 点击 <em> 会依次触发:
// Em (target phase)  
// Div (bubbling phase)

 

捕获传播

Capturing propagation is the opposite: from the root down to the target element.

设置 addEventListener 的第三个参数为 true 可以打开捕获模式:

// 添加捕获监听
document.addEventListener("click", e => alert("document"), true);
div.addEventListener("click", e => alert("div"), true);// 点击 <em> 会依次触发:  
// document (capturing phase)
// div (capturing phase)
// em (target phase)

 

事件流

完整的事件传播过程包含三个阶段:

  1. Capturing phase – 事件从document根节点向下传播到目标元素。
  2. Target phase – 事件到达目标元素,触发目标元素上的处理程序。
  3. Bubbling phase – 事件从目标元素向上冒泡回文档根节点。

我们可以在不同阶段通过传统的on<event>或addEventListener绑定处理程序。

应用场景

  • 根据冒泡或捕获机制,实现事件代理。
  • 使用捕获或冒泡根据需求控制事件处理顺序。

以上整理了事件冒泡和捕获的概念以及应用场景,希望对大家理解事件传播有帮助。

✨ 结语

        事件冒泡和捕获描述了DOM事件触发时的传播方向。掌握它们可以更好地控制事件处理逻辑。

        本文通过多个代码示例介绍了冒泡和捕获的概念、区别以及应用场景。希望这篇文章可以增进你对事件传播的理解,也可以作为后续面试的准备材料。如果有任何疑问,欢迎在评论区与我讨论。

    

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

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

相关文章

【C++干货铺】哈希结构在C++中的应用

目录 unordered系列关联式容器 unordered_map unordered_map的接口说明 1.unordered_map的构造 2. unordered_map的容量 3. unordered_map的迭代器 4. unordered_map的元素访问 5. unordered_map的查询 6. unordered_map的修改操作 7. unordered_map的桶操作 底层结构 …

mysql+node.js+html+js完整扫雷项目

一.下载 可以直接下载绑定资源&#xff0c; 也可以访问&#xff1a;克隆仓库&#xff1a;mine_clearance: mysqlnode.jshtmljs完整扫雷项目 (gitee.com) 二.运行sql数据文件 将mysql数据文件导入到本地 先在本地localhost里创建数据库 mine_clearance&#xff0c; 然后如图&…

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索 效果图定义子组件父组件应用 效果图 定义子组件 主要结合el-select和el-tree两个组件改造的。 <template><div class"selectTree"><el-select filterable :filter-method"filterMe…

微软给Windows 11增添了一个由AI支持的‘Voice Clarity’功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

linux搭建jupyter

查看虚拟环境 conda info --envs进入虚拟环境 conda activate my_env pip install jupyter pip install ipykernel1. jupyter notebook启动 1.1 创建临时jupyter notebook任务 jupyter notebook --ip0.0.0.0 --no-browser --allow-root --notebook-dir/home/xxx1.2 jupyter…

共用体与枚举法,链表的学习

结构体注意事项&#xff1a; 1.结构体类型可以定义在main函数里面&#xff0c;但是此时的作用域就被限定在该函数中 2.结构体的的的定义的形式&#xff1a;a.先定义类型&#xff0c;后定义变量-----struct stu s b.定义类型的同时&#xff0c;定义了变量&#xff1a;struct…

Notion 开源替代品:兼容 Miro 绘图 | 开源日报 No.162

toeverything/AFFiNE Stars: 25.6k License: NOASSERTION AFFiNE 是下一代知识库&#xff0c;将规划、排序和创建集于一身。它是一个注重隐私、开源、可定制且即插即用的替代方案&#xff0c;可以与 Notion 和 Miro 相媲美。主要功能和优势包括&#xff1a; 超融合&#xff1…

轻松使用python将PDF转换为图片(成功)

使用PyMuPDF&#xff08;fitz&#xff09;将PDF转换为图片 在处理PDF文件时&#xff0c;我们经常需要将PDF页面转换为图片格式&#xff0c;以便于在网页、文档或应用程序中显示。Python提供了多种方式来实现这一需求&#xff0c;本文将介绍如何使用PyMuPDF&#xff08;也称为f…

本地部署GeoServe服务并结合内网穿透实现任意浏览器远程访问

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

Python代码重构库之rope使用详解

概要 Python是一门强大的编程语言,但在大型项目中,维护和重构代码可能会变得复杂和困难。为了提高开发人员的效率和准确性,有许多工具可用于辅助代码重构和智能代码补全。其中之一是Python Rope。 Python Rope是一个用于Python编程语言的强大工具,它提供了丰富的功能,包…

绕过过滤注释符的sql注入

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、MySQL 注释符 注释符的作用 代码说明:注释用于对代码段进行说明,帮助开发和维护人员理解代码的功能和目的。注释内容在执行时会被数据库引擎忽略,不会影响实际的SQL执行。…

git pull的时候报错

错误信息&#xff1a;You have not concluded your merge (MERGE_HEAD exists). Please, commit your changes before you can merge. 原因&#xff1a;上一次pull的代码有冲突自动合并失败&#xff0c;在下一次pull之前你没有很好的解决这个冲突 方法&#xff1a; 1&#x…

【RT-DETR有效改进】利用YOLO-MS的MSBlock模块改进ResNet中的Bottleneck(RT-DETR深度改进)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是利用YOLO-MS提出的一种针对于实时目标检测的MSBlock模块(其其实不能算是Conv但是其应该是一整个模块),我们将其用于替换我们ResNet中Basic组合出一种新的结构,来替换我们网络中的…

Spring Boot 整合 Redis 使用教程

作为开发者&#xff0c;相信大家都知道 Redis 的重要性。Redis 是使用 C 语言开发的一个高性能键值对数据库&#xff0c;是互联网技术领域使用最为广泛的存储中间件&#xff0c;它是「Remote Dictionary Service」的首字母缩写&#xff0c;也就是「远程字典服务」。 Redis 以超…

在ROS(Robot Operating System)中常用的ROS功能包

ROS&#xff08;Robot Operating System&#xff09;拥有大量的功能包&#xff0c;这些功能包提供了从底层硬件控制到高级算法处理的多种功能。以下是一些常用的ROS功能包&#xff1a; 1. roscpp 和 rospy&#xff1a; - roscpp 是ROS的C客户端库&#xff0c;它提供了用于编…

网络通信--术语对照表

术语对照表 OSI 开放式系统互联通信参考模型&#xff08;英语&#xff1a;Open System Interconnection Reference Model&#xff0c;缩写为 OSI&#xff09;&#xff0c;简称为OSI模型&#xff08;OSI model&#xff09;&#xff0c;一种概念模型&#xff0c;由国际标准化组…

PyTorch复现网络模型VGG

VGG 原论文地址&#xff1a;https://arxiv.org/abs/1409.1556VGG是Visual Geometry Group&#xff08;视觉几何组&#xff09;的缩写&#xff0c;它是一个在计算机视觉领域中非常有影响力的研究团队&#xff0c;主要隶属于牛津大学的工程系和科学系。VGG以其对卷积神经网络&am…

Ubuntu(22.04):解决升级后在VirtualBox中的启动非常慢的问题

Ubuntu22.04是通过VirtualBox的虚机安装的&#xff0c;最近升级了Ubuntu22.04后&#xff0c;每次启动都非常的慢 $ systemd-analyze blame 5min 2.287s plymouth-quit-wait.service 5min 18ms vboxadd.service 可以看到是这两个服务启动的非常耗时&#xff0c;各用了5分钟多。 …

Vue3_基础使用

vue2的选项式与vue3的组合式区别&#xff1a; 选项式&#xff1a;vue2中数据与方法计算属性等等&#xff0c;针对一个数据的处理在不同的配置中&#xff0c;当业务复杂时很难维护&#xff0c;修改起来也不好查找。 vue3的组合式&#xff1a;将针对数据的方法计算属性等等放在一…

计算岛屿的数量-算法题(字节笔试题,做出来了,也被撸了)

题目 有一个二维数组&#xff0c;其中每个元素要么是1或者0&#xff0c;1表示土地&#xff0c;连起来的1表示一个岛屿&#xff0c;0表示海&#xff0c;请计算出来二维数组用有多少个岛屿 比如&#xff1a; {{1, 1, 1, 0, 1},{0, 1, 0, 1, 0},{1, 0, 1, 1, 1},{1, 1, 0, 1, 0…