js 事件模型 事件捕获、事件冒泡

什么是事件捕获、事件冒泡

事件冒泡(event bubbling)和事件捕获(event capturing)是指在 DOM 树中处理事件的两种不同方式

事件捕获

事件从DOM树的根节点开始,然后逐级向下捕获到最具体的元素(目标元素)。当事件捕获时,父级元素的事件处理程序会在子级元素的事件处理程序之前被触发。

找到目标元素dom  document → html → body → div

事件捕获的使用场景: 事件捕获在实际开发中使用较少。

事件处理程序前置操作:如果你需要在事件达到特定元素之前执行一些操作,例如在事件到达目标元素之前进行验证或修改事件的行为,可以使用事件捕获。通过在父级元素上使用事件捕获,你可以在事件到达目标元素之前拦截事件并进行处理。

高级事件处理:一些复杂的交互行为可能需要更细粒度的控制,而事件捕获提供了这种能力。例如,你可能需要在事件捕获阶段使用stopPropagation方法停止事件的传播,以防止事件继续向下冒泡。

事件冒泡

事件从触发它的最具体的元素(目标元素)开始,然后逐级向上冒泡到更一般的元素,直到达到DOM树的根节点。当事件冒泡时,父级元素的事件处理程序会在子级元素的事件处理程序之后被触发。

div → body → html → document  事件对应的操作通知到最顶层

事件冒泡的使用场景: 事件冒泡的一个常见应用场景是事件委托(event delegation)。通过事件委托,我们可以将事件处理程序绑定到父级元素,而不是直接绑定到每个子元素,从而减少了事件处理程序的数量,提高了性能和代码的可维护性。

事件冒泡和事件捕获区别:

  1. 触发顺序:事件捕获先于事件冒泡触发。在事件捕获阶段,事件从DOM树的根节点向下传播到目标元素;在事件冒泡阶段,事件从目标元素向上冒泡到根节点。
  2. 事件处理程序执行顺序:在事件捕获阶段,父级元素的事件处理程序会先于子级元素的事件处理程序执行;在事件冒泡阶段,子级元素的事件处理程序会先于父级元素的事件处理程序执行。
  3. 默认阶段:大多数事件处理程序默认情况下在事件冒泡阶段触发,因此它们通常在事件冒泡阶段被执行。但是,可以使用addEventListener的第三个参数来指定事件是在事件捕获阶段还是事件冒泡阶段处理。

在实际开发中,事件冒泡通常用得更多,因为它更符合常见的需求。通过事件冒泡,我们可以从子元素向父元素传递事件,便于事件委托和处理。然而,如果你需要更细粒度的控制事件的流动,或者需要在目标元素之前处理事件,那么可以使用事件捕获。

应用场景

监听事件:

addEventListener(type, function, boolean) // boolean是 true 在捕获阶段触发,false 在冒泡阶段触发,默认为 false

DOM1 是绑定一个函数;DOM2 是绑定一个队列,可以多个方法绑定同一事件。

btn.addEventListener('click', f1)

btn.addEventListener('click', f2) 

代码解释:

    我们在父级元素parent和子级元素child上分别使用事件捕获来绑定事件处理程序。
    通过设置addEventListener的第三个参数为true,我们指定了使用事件捕获模式。
    当点击按钮btn时,事件的触发顺序将是:parent捕获阶段 -> child捕获阶段 -> btn冒泡阶段。
    通过观察控制台输出,你可以看到事件处理程序按照捕获阶段的顺序被触发。
    输出顺序:parent child button

// 在事件捕获阶段触发事件处理程序
parent.addEventListener('click', function() {console.log('Parent element is clicked');
}, true);child.addEventListener('click', function() {console.log('Child element is clicked');
}, true);btn.addEventListener('click', function() {console.log('Button is clicked');
});

removeEventListener(type, funcName)  // 只能移除具名函数

题外话:不移除 eventListener 会有什么弊端

  • 避免内存泄漏:在 JavaScript 中,如果一个对象被引用但不再使用,它仍然会占用内存。如果我们添加了很多事件监听器,并且不及时将它们移除,那么这些事件监听器会一直占用内存,导致内存泄漏。
  • 避免重复触发事件:有些事件可能会被触发多次,例如 scroll 事件。如果我们不移除事件监听器,那么每次事件被触发时,都会执行事件处理程序。这可能会导致程序出现问题或性能下降。
  • 改变元素状态:某些事件会改变元素的状态,例如 mouseover 和 mouseout 事件。如果我们不及时移除这些事件监听器,那么它们会一直改变元素状态,导致用户体验不佳。

stopPropagation()  事件不传给其他的节点,阻止事件传播,什么时间阻止取决于调用方法的时间

preventDefault()  阻止默认的事件行为

比如:a标签 href 跳转,写了preventDefault 会阻止跳转,写了stopPropagation还是可以跳转,只是阻止了后续的冒泡/捕获。

事件委托:

我们将事件处理程序绑定到父级元素myList上,并使用事件对象的target属性来确定被点击的元素。
如果被点击的元素是li元素,我们就可以执行相应的操作(在这个示例中,只是简单地将被点击元素的文本内容打印到控制台)。
通过使用事件委托,我们无需为每个子元素都添加事件处理程序,而是将事件处理程序添加到父级元素上,利用事件冒泡来捕获和处理事件,从而简化了代码结构,并且对于动态添加或删除的子元素也能正常工作。

html:<ul id="myList"><li>Item 1</li><li>Item 2</li><li>Item 3</li><li>Item 4</li></ul>js:const myList = document.getElementById('myList');// 事件委托:将事件处理程序绑定到父级元素
myList.addEventListener('click', function(event) {// 检查被点击的元素是否是<li>元素if (event.target.tagName === 'LI') {// 执行针对<li>元素的操作console.log('Clicked on:', event.target.textContent);}
});

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

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

相关文章

网络爬虫入门

爬虫&#xff08;也被称为网络爬虫或网络蜘蛛&#xff09;是一种自动化程序&#xff0c;它可以在互联网上自动抓取数据。爬虫的基本工作原理通常包括以下几个步骤&#xff1a;发送请求&#xff1a;爬虫向目标网站发送HTTP请求&#xff0c;请求网页内容。接收响应&#xff1a;爬…

sklearn【F1 Scoree】F1分数原理及实战代码!

目录 一、F1 Scoree 介绍二、案例学习三、总结 一、F1 Scoree 介绍 在分类任务中&#xff0c;评估模型的性能是至关重要的。除了准确率&#xff08;Accuracy&#xff09;之外&#xff0c;我们还需要考虑其他指标&#xff0c;如精确度&#xff08;Precision&#xff09;和查全率…

根据 Figma 设计稿自动生成 Python GUI | 开源日报 No.221

ParthJadhav/Tkinter-Designer Stars: 8.0k License: BSD-3-Clause Tkinter-Designer 是一个用于快速创建 Python GUI 的工具&#xff0c;通过使用 Figma 设计软件&#xff0c;可以轻松地生成美观的 Tkinter GUI。 主要功能和优势包括&#xff1a; 拖放界面设计比手写代码更快…

鸿蒙应用开发之Web组件1

前面学习向导组件,现在来学习Web组件,这个组件也是一个比较复杂的组件,也是一个功能很强的组件,毕竟它是一个浏览器功能相当的组件,可以显示网页内容。 我们知道目前已经进入网络3.0时代,之前经历了1.0的文本时代,2.0的多媒体时代,现在进入全面交互时代。并且移动时代的…

百亿补贴低价的治理思路

各大电商平台都有陆续在推出百亿补贴通道&#xff0c;这对消费者来说&#xff0c;会更便捷&#xff0c;因为平台百亿补贴价格较低&#xff0c;不需要消费者再进行多链接、多平台的比价工作&#xff0c;直接下单即可&#xff0c;由于百亿补贴链接的上架主导权在平台&#xff0c;…

​面试经典150题——从前序与中序遍历序列构造二叉树

​ 1. 题目描述 2. 题目分析与解析 二叉树的前序、中序和后序遍历 二叉树的前序、中序和后序遍历是树的三种基本遍历方式&#xff0c;它们是通过不同的顺序来访问树中的节点的。 前序遍历&#xff08;Pre-order traversal&#xff09;&#xff1a; 访问根节点 前序遍历左子树…

详细介绍医用PSA变压吸附制氧机设备的工艺特点

随着技术的不断进步&#xff0c;医用氧气作为一种重要的治疗资源&#xff0c;其供应方式也在不断地改进和升级。其中&#xff0c;医用PSA(Pressure Swing Adsorption&#xff0c;变压吸附)变压吸附制氧机设备因其高效、安全、稳定的特点&#xff0c;受到了广大机构的青睐。那么…

Java高阶私房菜:快速学会异步编程CompletableFuture

为了使主程代码不受阻塞之苦&#xff0c;一般使用异步编程&#xff0c;而异步编程架构在JDK1.5便已有了雏形&#xff0c;主要通过Future和Callable实现&#xff0c;但其操作方法十分繁琐&#xff0c;想要异步获取结果,通常要以轮询的方式去获取结果&#xff0c;具体如下&#x…

String替换术:深入探索Java String类的替换方法

1. 概述 Java的String类提供了三种替换方法&#xff1a;replace()、replaceAll()和replaceFirst()。这些方法用于将字符串中的指定字符或子串替换为新的字符或子串。了解和正确使用这些方法有助于提高应用程序的性能和减少内存占用。 2. replace()方法详解 replace() 方法用于…

传统零售行业如何做数字化转型?

传统零售行业的数字化转型是一个系统性的过程&#xff0c;涉及到企业的多个方面。以下是一些关键步骤和策略&#xff0c;帮助传统零售企业实现数字化转型&#xff1a; 1、明确转型目标和战略 首先&#xff0c;企业需要明确数字化转型的目标和战略。包括确定企业的核心竞争力、…

照片光晕光学特效模拟调色Boris FX Optics 2024 mac下载安装教程

Boris FX Optics 2024 Mac版是一款照片光晕光学特效模拟调色软件&#xff0c;旨在模拟光学相机滤镜&#xff0c;专用镜头&#xff0c;胶卷和颗粒&#xff0c;镜头光晕&#xff0c;光学实验室处理&#xff0c;色彩校正以及自然光和摄影效果。用户可以通过应用光学并从160个滤镜和…

HAL STM32 I2C方式读取MT6701磁编码器获取角度例程

HAL STM32 I2C方式读取MT6701磁编码器获取角度例程 &#x1f4cd;相关篇《Arduino通过I2C驱动MT6701磁编码器并读取角度数据》&#x1f388;《STM32 软件I2C方式读取MT6701磁编码器获取角度例程》&#x1f4cc;MT6701当前最新文档资料&#xff1a;https://www.magntek.com.cn/u…

甘特图:项目管理者的必备神器,如何提高工作效率?

甘特图是什么&#xff1f;项目管理者大多都熟悉甘特图&#xff0c;它是一种直观展示项目计划执行过程的工具。通过条形图来显示项目、任务的时间安排&#xff0c;以及实际进度与计划进度的对比情况。 在我个人的项目管理实践中&#xff0c;甘特图确实帮助我提高了工作效率&am…

威纶通触摸屏与S7-1200进行标签通信(符号寻址)的具体方法示例

威纶通与S7-1200进行标签通信(符号寻址)的具体方法示例 前面和大家分享了威纶通与S7-1200通过绝对地址进行以太网通信的具体方法,具体内容可参考以下链接中的内容: 威纶通触摸屏与S7-1200以太网通信的具体方法和步骤(非常详细) 如下图所示,打开博途软件,新建一个项目,…

从事数据分析相关工作技术总结

在数据分析领域&#xff0c;掌握一系列技术和工具是非常重要的。以下是一些关键技术和技能&#xff0c;它们对于成为一名成功的数据分析师至关重要&#xff1a; 统计学和概率论 理基本的统计概念&#xff0c;如均值、中位数、方差、标准差、概率分布等。掌握假设检验、回归分析…

中国老铁路增开对国际旅客列车开行

4月13日&#xff0c;中老铁路国际旅客列车开行一周年之际&#xff0c;中老两国铁路部门在中国西双版纳至老挝琅勃拉邦两大著名旅游城市间增开1对国际旅客列车&#xff0c;旅客乘火车可实现两地间当日往返。标题&#xff1a;古道新程——中国老铁路增开国际旅客列车 在这个日新月…

Python3中的hashlib的md5加密实现

下面是以注册和登录来做为例子 import hashlib def md5(pwd):obj hashlib.md5("dfdfderewcsf".encode(utf-8)) # 加盐 obj.update(pwd.encode(utf-8))password obj.hexdigest()return passworddef register():user input("username: ")pwd input(&qu…

怎么直连某个服务器的dubbo服务

有时候我们可能和别的部门或者业务之间共同开发某个需求&#xff0c;这个时候&#xff0c;我们可能环境不统一&#xff0c;我们调用在做dubbo调用的时候&#xff0c;可能会调用到其他的环境&#xff0c;导致无法引用对方最新的代码及逻辑&#xff0c;所以&#xff0c;在某些时候…

图书管理系统概述

自友图书馆管理系统解决方案适用于中小学、大中专院校以及企事业单位中小型图书馆的自动化管理需求&#xff0c;其功能覆盖了图书馆自动化集成管理业务流程所包括的所有环节。《图书馆管理系统》首先应该按照我国图书馆行业通用CNMARC格式及《中图法第四版》行业标准开发而成,支…

利用Python进行文本预处理的过程(英文)

文本清理的主要目标是什么&#xff1f; 数据质量改进&#xff1a;文本数据通常包含错误、不一致和不相关的内容。清理有助于确保数据准确、可靠和一致。 降噪&#xff1a;文本数据中的噪声可能包括特殊字符、HTML 标签、标点符号和其他对分析或建模目标无益的元素。清洁可以消…