JavaScript DOM事件流之捕获与冒泡

DOM事件流——捕获与冒泡

网页是由一个一个元素组成的,正如我们肉眼所见,网页上的元素存在包含关系,简单的点击又怎么确定到底谁来触发响应呢?想象一下,在纸上画了两个大小不同的同心圆,然后用手指指向它里面的圆,那么你能说了指向的圆没有包含外面的圆吗?显然不是的,为了解决这个问题,出现了事件流。

DOM事件流三阶段

当用户与HTML页面交互(如点击按钮、移动鼠标等)时,就会产生事件,而DOM结构是一个树型结构,当一个HTML元素产生一个事件时,该事件会在元素节点与根结点之间的路径传播,路径所经过的结点都会收到该事件,这个传播过程可称为DOM事件流。DOM事件流主要分为三个阶段:捕获阶段、目标阶段、冒泡阶段。

1、捕获阶段Capturing 捕获是由网景公司最先提出的,事件从文档的根节点开始,‌向下传播至目标元素。‌在这个过程中,‌事件会经过目标元素的父元素、‌祖父元素等,‌但通常不会在这个阶段触发事件监听器,‌除非特别指定。这可以用于在事件传播到特定子元素之前,先进行一些全局性的处理或检查。

‌2、目标阶段Target 当事件到达目标元素时,‌事件会被触发,‌并执行绑定在该元素上的事件监听器。监听器就会按照它们被添加到元素上的顺序被调用,不管是捕获还是冒泡事件,只会按添加的顺序执行(注意⚠️:在最新的浏览器版本中如果同时存在默认和冒泡,都会先执行捕获!!!)

3、冒泡阶段Bubbling‌:冒泡是IE最早提出的,事件从目标元素开始,‌向上冒泡至根节点。‌在这个过程中,‌事件同样会经过目标元素的父元素、‌祖父元素等,‌且可以在这些元素上触发事件监听器。‌这通常用于实现事件的委托(Event Delegation),即在一个父元素上监听子元素的事件,从而减少事件监听器的数量,提高性能。在实际开发中我们使用跟多的也是冒泡,很少用到捕获。

在这里插入图片描述

代码示例,单击白色inner盒子,执行结果如下:

<!DOCTYPE html>
<html><head><title>DOM事件流</title></head><body><div class="outer"><div class="inner"></div></div></body><script>// 获取DOM元素let outer = document.querySelector('.outer')let inner = document.querySelector('.inner')// 绑定事件outer.addEventListener('click', () => console.log('outer冒泡阶段'), false) // 5outer.addEventListener('click', () => console.log('outer捕获阶段'), true) // 1inner.addEventListener('click', () => console.log('inner冒泡阶段'), false) // 4inner.addEventListener('click', () => console.log('inner捕获阶段方法1'), true) // 2inner.addEventListener('click', () => console.log('inner捕获阶段方法2'), true) //3</script><style>.outer {display: flex;align-items: center;width: 300px;height: 300px;background-color: pink;}.inner {margin: 0 auto;width: 200px;height: 200px;background-color: white;}</style>
</html>

在这里插入图片描述

可见,事件的整体顺序是:祖先元素捕获 -> 目标元素捕获 -> 目标元素冒泡 -> 祖先元素冒泡(⚠️老版本浏览器目标元素可能按绑定顺序执行)

无法冒泡的事件

基本上只有onloadunloadfocusblursubmitchange事件是不支持冒泡的

阻止冒泡

为什么要阻止冒泡

1、提高性能和效率:如果多个元素(如父元素和子元素)都绑定了相同或相似的事件处理函数,并且这些函数都执行了相似的操作,那么当事件发生时,这些函数都会被调用,从而导致重复的计算或处理,浪费资源。通过阻止事件冒泡,可以避免这种不必要的重复处理,提高代码的性能和效率。

2、控制事件传播范围:有时候,我们可能只希望事件在特定的元素上触发,而不希望它继续传播到父元素或祖先元素上。通过阻止事件冒泡,我们可以精确地控制事件的传播范围,确保事件只在目标元素上触发。

3、防止事件的冲突和干扰:在复杂的前端应用中,可能存在多个嵌套的元素,它们都有自己的事件处理逻辑。如果事件冒泡到了父元素或祖先元素,可能会触发其他元素上的事件处理函数,导致事件的冲突和干扰。

如何阻止冒泡

1、stopPropagation()标准方法:利用事件对象里面的stopPropagation()方法

    outer.addEventListener('click', () => console.log('outer冒泡阶段'), false)outer.addEventListener('click', () => console.log('outer捕获阶段'), true)inner.addEventListener('click', () => console.log('inner冒泡阶段'), false)inner.addEventListener('click',() => {console.log('inner捕获阶段方法1')event.stopPropagation()},true)

执行结果如下,在捕获阶段使用stopPropagation()冒泡都被阻止了

在这里插入图片描述

2、cancelBubble兼容性方法:虽然stopPropagation()已被大多数浏览器支持,但IE6-8需要利用事件对象的cancelBubble属性阻止冒泡,即设置:window.event.cancelBubble = true;

3、在事件处理函数中返回false:这个方法很多地方都有提到,但实践起来并不奏效,首先他限定事件处理函数是通过HTML属性(如onclick)或者某些特定的JavaScript库(如jQuery)以特定方式注册的,其次不同浏览器处理方式也不一样,最新的浏览器中大多数已经无法奏效了

4、设置CSS属性:虽然CSS本身不直接提供阻止事件冒泡的功能,但有时候通过改变元素的显示方式(如display: none;)或可交互性(如pointer-events: none;),可以间接影响事件的传播,这个方法具有局限性

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

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

相关文章

迁移替换AD域时,有几个关键点需要注意

在当今的数字化时代&#xff0c;企业对于身份管理和访问控制的需求日益增长。然而&#xff0c;传统的AD域控方案在面对国产化替代和业务上云的趋势时&#xff0c;逐渐显露出一些局限性。宁盾国产化身份域管作为一种迁移替换AD域控的创新解决方案&#xff0c;正逐渐崭露头角&…

通风天窗代号解析与功能介绍

通风天窗的代号通常涉及其类型、型号、尺寸及功能等多个方面。以下是对通风天窗代号的一般性释义。一、代号结构 通风天窗的代号往往遵循一定的编码规则&#xff0c;以清晰表示其特性。如在18J621-3《通风天窗》图集中&#xff0c;通风天窗的代号可能以“TCxx-xxx”的形式出现&…

云计算的成本:您需要了解的 AWS 定价信息

AWS 定价方案、免费套餐优惠以及通过预先预留容量来降低总体成本的选项。 欢迎来到雲闪世界。越来越多的企业开始转向云基础设施而非本地数据中心&#xff0c;云领域的竞争空前激烈。主要参与者甚至不惜削减成本并提供令人难以置信的折扣&#xff0c;以在云市场中占据一席之地。…

利用机器人自动回复软件,显著提升客户体验

随着科技的飞速发展及互联网普及&#xff0c;机器人自动回复软件成为了现代企业的重要工具。无论是在客户服务领域&#xff0c;还是在营销、销售等方面&#xff0c;自动回复机器人都表现出了强大的功能和显著的效果。究竟什么是机器人自动回复技术?它是如何运行的?本文将为您…

ELK学习笔记——如何给Kibana新增用户和角色

Kibana新增用户和角色 首先用超管账号登录上Kibana&#xff0c;按照下面步骤操作 1、创建角色 按图操作 2、创建用户 按图操作 3、给用户分配角色 至此&#xff0c;角色和用户绑定成功&#xff1b; 最后&#xff0c;可以退出管理员账号&#xff0c;登录这个新…

安防监控/视频汇聚EasyCVR视频监控平台级联上级,无法播放是什么原因?

EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。EasyCVR视频汇聚平台采用先进的图像处理技术和传输协议&#xff0c;能够确保高清、稳定的…

抖音发布Unity小游戏的errorMsg: native build failed

为了更好的性能&#xff0c;兼容更多字节平台&#xff0c;选择了Android Native IOS WebGL方案。结果Native经常报错&#xff1a;errorMsg: native build failed&#xff0c;导致IL2CCP构建失败。 最终&#xff0c;花了我两周时间&#xff01;两周啊&#xff01;还是无法解决。…

H3C SR-MPLS通过OSPF通告SID配置

首先在配置前理解几个基本概念 Prefix SID配置 统一分配和配置&#xff08;全局规划&#xff09;loopback和prefix sidPrefix SIDSRGB Base&#xff08;16000&#xff09;index Adj SID自动生成 对应SR节点间的互联链路SR节点本地标识&#xff0c;从设备本地Segment池中动态…

swagger简单使用学习

注意 一下基于spring-boot 3.0.2版本&#xff0c;该版本不支持springfox-swagger2 2.9.2会报错&#xff0c;无法访问swagger 安装 在pomx文件中添加对应的依赖 <!-- swagger --><dependency><groupId>org.springdoc</groupId><artifactId>spr…

【三维重建】近期进展(完善中)

文章目录 前言一、UC-gs:交叉视图不确定性的航拍街道重建&#xff08;Drone-assisted Road Gaussian Splatting with Cross-view Uncertainty&#xff09;&#xff08;质量 &#xff09;细节结果 二、实时高斯&#xff1a;通过光度SLAM加速3DGS&#xff08;Towards Real-Time G…

Facebook的AI进化:如何用智能技术提升内容推荐

在数字时代&#xff0c;社交媒体平台不仅是信息传播的重要渠道&#xff0c;也是个人和品牌互动的关键平台。Facebook作为全球领先的社交媒体网络&#xff0c;其内容推荐系统的优化在很大程度上提升了用户体验。本文将探讨Facebook如何通过人工智能&#xff08;AI&#xff09;技…

AD7606工作原理以及FPGA控制验证(串行和并行模式)

文章目录 一、AD7606介绍二、AD7606采集原理2.1 AD7606功能框图2.2 AD7606管脚说明 三、AD7606并行模式时序分析以及实现3.1 并行模式时序图3.2 并行模式时序要求3.3 代码编写3.4 仿真观察 四、AD7606串行模式时序分析以及实现4.1 串行模式时序图4.2 串行模式时序要求4.3 代码编…

Oracle版本简介手册

Oracle版本简介手册 图1—数据库发布路线图表 Oracle数据库的各个版本反映了其技术的发展历程和功能增强&#xff0c;从最早的Oracle 1&#xff08;1979年&#xff09;到最新的版本&#xff0c;每个版本都带来了新的特性和改进&#xff0c;以满足不断变化的企业需求。以下是Or…

d3dcompiler_47.dll缺失的可能原因多种多样,那么d3dcompiler_47.dll缺失怎么修复

在数字世界的深处&#xff0c;d3dcompiler_47.dll文件扮演着至关重要的角色&#xff0c;它是Direct3D编译器的一部分&#xff0c;负责处理图形渲染和游戏运行中的关键任务。然而&#xff0c;当用户启动某个程序或游戏时&#xff0c;屏幕上突然弹出的错误提示“d3dcompiler_47.d…

【运维监控】influxdb 2.0+telegraf 监控tomcat 8.5运行情况(1)

关于java应用的监控本系列有文章如下&#xff1a; 【运维监控】influxdb 2.0telegraf 监控tomcat 8.5运行情况 【运维监控】influxdb 2.0grafana 监控java 虚拟机以及方法耗时情况 【运维监控】Prometheusgrafana监控tomcat运行情况 【运维监控】Prometheusgrafana监控spring b…

使用mobaxterm连接linux出现连接中断问题

1.问题描述 使用mobaxterm在连接到远程服务器时&#xff0c;如果隔一段时间不进行操作的话&#xff0c;会出现中断连接的现象。 2.解决 为了增强Linux系统的安全性&#xff0c;我们需要在用户输入空闲一段时间后自动断开&#xff0c;这个操作可以由设置TMOUT值来实现。将以下…

全球圆柱锂电池行业领军者!比克电池亮相2024深圳eVTOL展

2024深圳eVTOL产业发展大会暨低空经济展览会将于9月23-25日在深圳坪山燕子湖国际会展中心举办。展会将通过“两天论坛三天展览”的形式展开&#xff0c;专注未来城市空中交通新形态、民用有人驾驶、无人驾驶航空器、城市低空物流&#xff0c;并讨论eVTOL的整机研发、设计、制造…

【云计算】什么是云计算服务|为什么出现了云计算|云计算的服务模式

文章目录 什么是云计算服务本地部署VS云计算SaaS PaaS IaaS公有云、私有云、混合云为什么优先发展云计算服务的厂商是亚马逊、阿里巴巴等公司 什么是云计算服务 根据不同的目标用户&#xff0c;云计算服务&#xff08;Cloud Computing Services&#xff09;分为两种&#xff1…

制作自己的游戏:打砖块

文章目录 &#x1f680; 前言&#x1f680; 前期准备&#x1f680; 玩法设计&#x1f680; 游戏场景&#x1f353; 什么是游戏场景&#x1f353; 绘制左上角积分&#x1f353; 绘制右上角生命值&#x1f353; 绘制砖块&#x1f353; 绘制小球&#x1f353; 绘制挡板&#x1f35…

Java实用类——StringBuffer类和StringBuilder类

StringBuffer类和StringBuilder类位于java.util包中&#xff0c;是String类的增强型&#xff0c;提供了很多方法可供使用 StringBuffer和StringBuilder出现的原因是&#xff1a;使用拼接字符串会浪费大量内存空间 String a "Hello"; a a "chmy"; 新的…