JS 事件委托

news2024/11/18 14:52:10

JavaScript事件委托(Event delegation)又叫事件代理,是一种在父元素上监听事件,然后通过事件冒泡机制来处理子元素的事件的技术。通过事件委托,可以避免为每个子元素都绑定事件处理程序,提高性能并简化代码。

事件委托的基本原理是将事件处理程序绑定在父元素上,然后通过事件冒泡捕获到子元素的事件触发。这样,无论子元素是现有的还是动态生成的,它们的事件都会被父元素捕获并处理。

事件捕获和事件冒泡示例图

<!DOCTYPE html>
<html>
<head>
  <title>事件委托示例</title>
</head>
<body>
  <ul id="list">
    <li>项目1</li>
    <li>项目2</li>
    <li>项目3</li>
    <li>项目4</li>
  </ul>

  <script>
    // 获取父元素
    var list = document.getElementById('list');

    // 添加点击事件监听器到父元素
    list.addEventListener('click', function(event) {
      // 检查目标元素是否是列表项
      if (event.target.tagName === 'LI') {
        // 在控制台输出被点击的列表项的文本内容
        console.log(event.target.textContent)
      }
    })
  </script>
</body>
</html>

一、事件捕获

事件捕获(Event Capturing)是事件传播的一种阶段,它是事件冒泡的前置阶段。在事件捕获阶段,事件从最外层的祖先元素开始,逐级向下传播,直到达到目标元素。

二、事件冒泡

事件冒泡(Event Bubbling)是指在前端网页开发中,当一个元素上的事件被触发时,如果该元素上有注册该事件的处理程序,那么这个事件会沿着元素的层次结构向上冒泡,依次触发父元素的同一事件。

当某个元素上发生了一个事件,比如点击(click)事件,首先会执行该元素自身绑定的事件处理函数,然后这个事件会向上冒泡,触发父元素上绑定的相同事件处理函数。如果父元素也有父元素,那么事件会继续向上冒泡,依次触发更高层级的父元素上的事件处理函数,直到冒泡到文档的根元素(通常是 <html>元素)为止。

事件冒泡是浏览器默认的事件传播方式,但可以通过调用事件对象的 stopPropagation() 方法来停止事件的冒泡,阻止事件继续传播到上层元素。

三、为什么要使用事件委托

JavaScript中,页面内事件处理程序的个数会直接影响页面的整体性能,因为每个事件处理程序都是对象,对象会占用内存,内存中的对象越多,页面的性能则越差。事件委托技术可以避免对每个字元素添加事件监听器,减少操作DOM节点的次数,从而减少浏览器的重绘和重排,提高代码的性能。

四、事件委托实现原理

事件委托的实现原理是基于事件冒泡机制。当一个元素上发生了某个事件(如点击事件),事件会从触发元素开始向上冒泡,直到根节点。事件委托利用了事件冒泡的特性,将事件处理程序绑定在父元素上,通过事件冒泡捕获子元素的事件。

以下是事件委托的实现原理步骤:

1.给父元素绑定事件  
2.给父元素定义事件,监听子元素的冒泡事件 
3.找到是哪个子元素的事件,通过匿名回调函数的参数e用来接收事件对象,通过target获取触发事件的目标

五、事件委托的优缺点

优点缺点
减少内存消耗事件处理逻辑可能变得复杂
支持动态元素不适用于捕获阶段的事件
提高性能事件冒泡可能导致事件处理不准确
简化代码结构需要合理选择合适的父元素
支持事件冒泡机制某些事件无法冒泡(如滚动事件等)
提供统一的事件处理逻辑事件委托的性能提升可能不明显,取决于具体情况

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

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

相关文章

SC7504运算放大器(OPA)可pin对pin兼容OPA4350

SC750x 系列轨至轨 CMOS 运算放大器针对低电压单电源运行进行了优化。轨至轨输入和输出、低噪声(5nV/√Hz) 和高速运行(38MHz, 22V/μs) 使得运算放大器非常适合驱动模数 (A/D) 转换器。可pin对pin兼容OPA4350。而且也适用于手机功率放大器 (PA) 控制环路和视频处理&#xff08…

【嵌入式Qt开发入门】初识Qt——Linux下安装Qt

Qt 是什么&#xff1f; Qt 是一个跨平台的 C开发库。主要用来开发图形用户界面&#xff08;Graphical User Interface&#xff0c;简 称 GUI&#xff09;程序。 Qt 虽然经常被当做一个 GUI 库&#xff0c;用来开发图形界面应用程序&#xff0c;但这并不是 Qt 的全部&#xff1b…

Win11总是出现BitLocker恢复,想要彻底关闭它该如何操作?

win11解除bitlocker加密方法一&#xff1a; 1、首先按下键盘“WinR”打开运行(如图所示)。 2、打开运行后&#xff0c;在其中输入“control”并点击“确定”打开控制面板(如图所示)。 3、打开后&#xff0c;进入“bitlocker驱动器加密”(如图所示)。 4、随后展开被加密的磁盘&…

Pycharm报错Non-zero exit code (2)

问题现象&#xff1a; 通常我们拿到一个Python项目后&#xff0c;项目中有requirement.txt文件&#xff0c;里面有列出需要安装的三方库&#xff0c;使用pycharm直接安装这些库时&#xff0c;报错&#xff1a;Non-zero exit code (2) 解决方案&#xff1a; 第一种临时解决方案&…

模糊图片秒转高清图,分享几个免费方法!

相信大家都曾经遇到过拍摄的老旧照片放大后变得模糊不清的情况。然而&#xff0c;由于这些照片是我们自己拍摄的&#xff0c;我们也无法在网上找到并下载原始高清图像。那么&#xff0c;有没有什么方法可以修复这种模糊不清的照片呢&#xff1f;当然&#xff0c;很多人可能会说…

计算机硬件

硬盘 固态硬盘&#xff08;SSD&#xff09;拥有比机械硬盘&#xff08;HDD&#xff09;更快的读写速度。目前大多数机器使用的是SATA总线标准&#xff0c;实际最高传输约为600MB/s。而支持PCIe总线&#xff0c;NVMe协议的SSD&#xff0c;实际传输速度将超过1000MB/s。 当前采…

KDG5V-8-33C330N200-EX-H-M-U-H1-20比例方向阀控制器

与外置电子放大器一起使用&#xff0c;在智能控制系统和液压系统之间提供接口。这是一种非常实用的方法&#xff0c;用于控制执行器的方向和速度&#xff0c;同时消除了机器负载的快速加速和减速所引起的冲击。除了提高机器的性能和寿命外&#xff0c;通过将方向和流量控制能力…

【UE5 Cesium】04-Cesium for Unreal 将不同地区的倾斜摄影作为不同子关卡

上一篇&#xff1a;【UE5 Cesium】03-Cesium for Unreal 添加本地数据集 步骤 1. 新建一个空白关卡 保存新建的关卡&#xff0c;命名为“Globe” 添加地图 再添加“Cesium SunSky”和“DynamicPawn” 在大纲中选中“Globe&#xff08;编辑器&#xff09;”&#xff0c;然后勾…

深入浅出设计模式 - 享元模式

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

初始Git

文章目录 前言技术目标协作目标 一、提出问题二、如何解决版本控制器注意事项 三、Git安装Linux-centosLinux-ubuntu 四、Git基本操作创建Git本地仓库配置Git 总结 前言 技术目标 掌握Git企业级应用,深刻理解Git操作过程与操作原理,理解工作区,暂存区,版本库的含义.掌握Git版…

LC-1595. 连通两组点的最小成本(状态压缩DP(记忆化搜索==>动态规划))

1595. 连通两组点的最小成本 难度困难86 给你两组点&#xff0c;其中第一组中有 size1 个点&#xff0c;第二组中有 size2 个点&#xff0c;且 size1 > size2 。 任意两点间的连接成本 cost 由大小为 size1 x size2 矩阵给出&#xff0c;其中 cost[i][j] 是第一组中的点 …

FineReport学习3

冻结行列&#xff08;冻结表头&#xff09; 创建多数据源之间的关联 给单元格添加过滤条件&#xff0c;让 ds2 的「客户ID」等于 ds1 的「客户ID」&#xff0c;这样两数据集就关联起来 复杂多源报表

.NETCore项目在Windows下构建Docker镜像并本地导出分发到CentOS系统下

在Windows下使用Docker&#xff0c;我们选择Docker Desktop这个软件&#xff0c;非常方便。 Docker Desktop介绍及安装 Docker Desktop是适用于Mac、Linux或Windows环境的一键安装应用程序&#xff0c;使您能够构建和共享容器化应用程序和微服务。 它提供了一个简单的GUI&…

[数据库系统] 五、数据增删改

第一关&#xff1a;数据插入 用insert给数据库添加数据 相关知识 有关系student(sno,sname,ssex,sage,sdept)&#xff0c;属性对应含义&#xff1a;学号&#xff0c;姓名&#xff0c;性别&#xff0c;所在系。现有的部分元组如下所示 insert 向数据库表插入数据的基本格式有…

生成 ocr key 字符集 alphabet 6698个字符

生成 ocr key 字符集 alphabet import pickle as pkl#----------- 生成 ocr key 字符集 alphabet alphabet_set set() # 数据集label infofiles_label [/home/jlb/下载/rec_data_lesson_demo/train.txt, /home/jlb/下载/rec_data_lesson_demo/val.txt]# ppocr中文key infofil…

SpringBoot—热部署(Community)

配置热部署 &#x1f50e;引入依赖&#x1f50e;设置 Settings 文章介绍的是社区版 Idea 配置热部署的步骤 &#x1f50e;引入依赖 复制如下代码至 pom.xml 文件中即可 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-b…

无人机遥感在农林信息提取中的实现方法与GIS融合制图教程

详情点击链接&#xff1a;无人机遥感在农林信息提取中的实现方法与GIS融合制图 遥感技术作为一种空间大数据手段&#xff0c;能够从多时、多维、多地等角度&#xff0c;获取大量的农情数据。数据具有面状、实时、非接触、无伤检测等显著优势&#xff0c;是智慧农业必须采用的重…

【夏季旅行团建】趣玩千岛湖-环湖骑行闯关-卡丁车上演速度与激情-刺激高空体验,杭州周边江浙沪团建好去处

千岛湖的秀丽景色让人惊艳&#xff0c;也是江浙沪地区热门的团建目的地之一&#xff1b; 千岛湖隶属于淳安县。从杭州自驾2个小时&#xff0c;高铁1小时&#xff0c;属于国家5A级别的人工湖&#xff0c;前身是新安江水库。拥有星罗棋布的1078个岛屿&#xff0c;是世界上岛屿最多…

AndroidStudio xml布局文件输入没有提示

AndroidStudio xml布局文件输入没有提示&#xff0c;如下图&#xff1a; 原因是老的AndroidStudio与新的sdk版本不一致 方法1&#xff1a;修改compileSdkVersion低于33即可&#xff0c;不建议 方法2&#xff1a;升级AndroidStudio版本&#xff0c;建议 如下是我的AndroidStu…

详解序列化

目录 1.什么是序列化 2.JAVA中的序列化 2.1.成员变量必须可序列化 2.2.transient关键字&#xff0c;可避免被序列化 2.3.无法更新状态 2.4.serialVersionUID 3.JDK序列化算法 4.序列化在实际中的一些应用 1.什么是序列化 序列化就是将对象转换为二进制格式的过程。对象…