当前位置: 首页 > news >正文

JS的事件委托(Event Delegation)

✨ 事件委托(Event Delegation)及其优势和缺点

🎃 什么是事件委托

事件委托是一种在JavaScript中处理事件的技术。它利用了事件的冒泡机制,将事件处理程序绑定到它们的共同祖先元素上,而不是直接绑定到每个子元素上。当事件触发时,事件会从子元素一直冒泡到祖先元素,然后通过判断事件的目标元素来执行相应的事件处理程序。

🎁 优势

事件委托具有以下优势:

  1. 内存效率:事件委托通过减少事件处理程序的数量,节省内存资源。相比每个子元素都绑定事件处理程序,只需在共同祖先元素上绑定一个事件处理程序即可。

  2. 动态处理:当动态添加或移除子元素时,无需重新绑定和解绑事件处理程序。因为事件处理程序是绑定到祖先元素上的,不受子元素的变化影响。

  3. 简化代码:通过事件委托,可以减少重复的事件绑定代码,简化代码结构。尤其是当有大量子元素需要绑定相同的事件处理程序时,使用事件委托可以显著简化代码。

  4. 动态事件处理:通过判断事件的目标元素,可以根据需要选择执行不同的操作或处理程序。这样可以更灵活地处理事件,并且不需要为每个子元素都编写独立的事件处理程序。

💔 缺点

事件委托也有一些缺点需要注意:

  1. 不适用于所有场景:某些需要特定处理的事件,仍需要直接绑定到子元素上,而不适用于委托给祖先元素处理。

  2. 目标元素判断:在事件处理程序中需要正确判断事件的目标元素,以执行相应的操作。如果判断逻辑复杂或错误,可能会导致意外行为。

  3. 不支持所有事件:某些特定的事件(例如focus、blur等)无法在祖先元素上进行委托。

🌰例子:

当一个页面中有多个按钮,并且每个按钮都需要绑定点击事件时,可以使用事件委托来简化代码。

假设我们有以下 HTML 结构:

<div id="button-container"><button class="btn" data-action="action-1">按钮1</button><button class="btn" data-action="action-2">按钮2</button><button class="btn" data-action="action-3">按钮3</button><button class="btn" data-action="action-4">按钮4</button><!-- 更多按钮... -->
</div>

我们希望每个按钮被点击时,执行不同的操作。使用事件委托,我们可以将点击事件处理程序绑定到按钮容器上,通过判断点击事件的目标元素(按钮),执行对应的操作。

const buttonContainer = document.getElementById("button-container");buttonContainer.addEventListener("click", function(event) {if (event.target && event.target.classList.contains("btn")) {const action = event.target.getAttribute("data-action");// 执行对应的操作switch (action) {case "action-1":// 处理按钮1的点击事件console.log("点击了按钮1");break;case "action-2":// 处理按钮2的点击事件console.log("点击了按钮2");break;case "action-3":// 处理按钮3的点击事件console.log("点击了按钮3");break;case "action-4":// 处理按钮4的点击事件console.log("点击了按钮4");break;// 更多按钮的处理...}}
});

通过事件委托,我们只需绑定一个点击事件处理程序到按钮容器上,而不需要为每个按钮都单独绑定事件处理程序。当新的按钮被添加到容器中时,它们也会自动具有相同的点击处理逻辑,无需额外的代码。这样可以大大简化代码,并且方便动态添加或删除按钮时的事件管理。

🚀 结论

事件委托是一种处理事件的有效技术,通过将事件处理程序绑定到共同祖先元素上,可以实现优化的事件管理和处理。它在内存效率、动态处理、代码简化和动态事件处理等方面具有优势。

然而,事件委托并非适用于所有场景,需要在实际使用中权衡利弊。在特定需求下,仍需要直接绑定到子元素上的事件处理程序。同时,在使用事件委托时,需要正确判断事件的目标元素,以避免意外行为的发生。

相关文章:

JS的事件委托(Event Delegation)

✨ 事件委托&#xff08;Event Delegation&#xff09;及其优势和缺点 &#x1f383; 什么是事件委托 事件委托是一种在JavaScript中处理事件的技术。它利用了事件的冒泡机制&#xff0c;将事件处理程序绑定到它们的共同祖先元素上&#xff0c;而不是直接绑定到每个子元素上。…...

selenium+python自动化安装驱动 碰到的问题

刚开始使用谷歌驱动&#xff0c;我的谷歌浏览器版本是最新版下载驱动地址&#xff0c;访问不了。 Chrome for Testing availability只能使用火狐驱动&#xff0c;我这里的火狐版本也是最新版119.0 查找全网找到驱动geckodriver下载地址 https://mirrors.huaweicloud.com/ge…...

laravel+vue2 element 一套项目级医院手术麻醉信息系统源码

手术麻醉临床信息系统源码&#xff0c;PHPmysqllaravelvue2 手术麻醉临床信息系统&#xff0c;采用计算机和通信技术&#xff0c;实现监护仪、麻醉机、输液泵等设备输出数据的自动采集&#xff0c;采集的数据能够如实准确地反映患者生命体征参数的变化&#xff0c;并实现信息高…...

GEE——使用MODIS GPP和LAI数据进行一元线性回归计算和R2分析

使用两种方法计算一元线性回归,一种使用GEE本身自带的函数,另一种使用自己编写代码的方式进行,对比两者结果的差异。 简介 一元线性趋势分析是指利用一元线性回归模型来分析一组数据的趋势性。在一元线性回归模型中,我们假设自变量(x)和因变量(y)之间存在一定的线性关…...

[论文阅读]Point Density-Aware Voxels for LiDAR 3D Object Detection(PDV)

PDV Point Density-Aware Voxels for LiDAR 3D Object Detection 论文网址&#xff1a;PDV 论文代码&#xff1a;PDV 简读论文 摘要 LiDAR 已成为自动驾驶中主要的 3D 目标检测传感器之一。然而&#xff0c;激光雷达的发散点模式随着距离的增加而导致采样点云不均匀&#x…...

自动化学报格式 Overleaf 在线使用 【2023最新教程】

自动化学报格式 Overleaf 在线使用 摘要 2023年10月26日19:28:17&#xff08;云南昆明&#xff09; 今天课程老师要我们期末提交一篇论文&#xff0c;以自动化学报格式提交。因此&#xff0c;去官网发现只有 latex 格式&#xff0c;下载下来发现各种格式不兼容&#xff1b;由于…...

掌握CSS动画技巧:打造引人注目的页面过渡效果!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一…...

薛定谔的猫重出江湖?法国初创公司AliceBob研发猫态量子比特

总部位于巴黎的初创公司Alice&Bob使用超导芯片的两个相反的量子态&#xff08;他们称之为“猫态量子比特”芯片&#xff09;来帮助开发量子计算的不同自旋方式。&#xff08;图片来源&#xff1a;网络&#xff09; 有的人认为&#xff0c;构建量子计算机的模块模仿了著名的…...

18亿欧元大动作,法国瞄准实现量子飞跃

Quobly 正在开发一种容错量子处理器&#xff08;图片来源&#xff1a;网络&#xff09; 2021年1月&#xff0c;马克龙总统宣布了法国国家量子计算计划&#xff0c;并将为该技术投入高达18亿欧元。 “量子战略至关重要&#xff0c;”马克龙在量子研究中心巴黎萨克雷大学宣布该…...

写保护设置——三、I2C EEPROM

三、I2C EEPROM I2C通讯的EEPROM只有硬保护&#xff0c;没有软保护。 以AT24C01A/02/04/16型EEPROM和AT24C02A/04A/08A/16A型EEPROM为例&#xff0c;管脚定义和写保护WP功能分别如下。 &#xff08;1&#xff09;AT24C01A/02/04/16型EEPROM 规格书&#xff1a; AT24C01A/02…...

【嵌入式】HC32F07X ADC采样及软件滤波

目录 一 背景说明 二 原理分析 三 电压采样 四 软件滤波 一 背景说明 使用小华&#xff08;华大&#xff09;的MCU HC32F07X实现四个通道的 0-5V 电压采样&#xff0c;并对采样结果进行滤波处理。 二 原理分析 【1】ADC原理说明&#xff1a; 单片机是数字芯片&#xff0c;…...

VSCode snippets

生成工具&#xff1a;https://snippet-generator.app/ VSCode snippets&#xff1a;https://code.visualstudio.com/docs/editor/userdefinedsnippets#/ VS Code 中的 Snippets 是一种快捷方式&#xff0c;可以帮助你更快地编写代码。你可以创建自己的 Snippets&#xff0c;也…...

openEuler 22.03 LTS 环境使用 Docker Compose 一键部署 JumpServer (all-in-one 模式)

环境回顾 上一篇文章中&#xff0c;我们讲解了 openEuler 22.03 LTS 安装 Docker CE 和 Dcoker Compose&#xff0c;部署的软件环境版本分别如下&#xff1a; OS 系统&#xff1a;openEuler 22.03 LTS(openEuler-22.03-LTS-x86_64-dvd.iso)Docker Engine&#xff1a;Docker C…...

宏电5G RedCap工业智能网关获首个中国移动5G物联网开放实验室5G及轻量化产品能力认证

10月21日&#xff0c;2023世界物联网博览会——中国移动物联网开发者大会暨物联网产业论坛在无锡圆满举行。宏电股份参与中国移动5G物联网开放实验室5G及轻量化产品能力认证成果授牌仪式&#xff0c;并获得认证证书。 此次认证主要对产品功能、产品性能、RedCap网络兼容性进行测…...

MySQL查询今日、昨日、最近七天的数据

查询今日数据 sql语句&#xff1a; SELECT * FROM short_oper_log WHERE to_days(login_time) to_days(now());运行结果&#xff1a; 查询昨日数据 sql语句&#xff1a; SELECT * FROM short_oper_log WHERE DATEDIFF(login_time,NOW()) -1;运行结果&#xff1a; 额外…...

Oracle 19c新特性:DBCA静默模式克隆远端PDB

源库为ORCL中的orclpdb1&#xff0c;目标库为ORCL2。版本均为19c。 我们将利用19c中dbca新支持的-createFromRemotePDB选项来从远端克隆PDB。 确认源库中有业务数据&#xff1a; SQL> connect hrorclpdb1 Enter password: Connected. SQL> select count(*) from hr.em…...

css:如何通过不同的值,改变盒子的样式和字体颜色通过computed而不是v-if

在使用uni-app编写功能时&#xff0c;可以通过computed方法来实现根据num这个值也可以是后端传过来的值只要是number类型都可以。不同取值来修改盒子的背景颜色和字体颜色。首先&#xff0c;在data中定义一个num来存储当前的值&#xff0c;然后在computed中创建一个样式对象&am…...

做外贸真诚是最好的套路

在朋友圈发装柜的照片&#xff0c;之前合作的一些其他供应商看到了就问&#xff1a;最近生意怎样啊&#xff1f;看着好像挺多货出的&#xff0c;怎么最近都没跟我拿货啊&#xff1f; 空了我就回复&#xff1a;最近一般啊&#xff0c;有人做得很好&#xff0c;单很多&#xff0…...

RPA厂商大比拼,哪家才更适合您?

引言&#xff1a;随着数字化时代的到来&#xff0c;自动化已成为推动企业数字化发展的关键举措之一&#xff0c;RPA作为自动化中的重要技术之一&#xff0c;可为企业提供了实现业务流程自动化的强大工具。然而&#xff0c;如何选择适合自己的RPA厂商也是各大企业现在面临的难题…...

更换网络ip地址怎么设置

在互联网时代&#xff0c;网络已经成为我们生活中不可或缺的一部分。随着网络技术的不断发展&#xff0c;IP地址作为网络通信中的重要标识&#xff0c;其重要性日益凸显。在某些情况下&#xff0c;我们需要更换网络IP地址以保护自己的信息安全。那么&#xff0c;更换网络IP地址…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...