javascript基础十四:解释下什么是事件代理?应用场景?

news2025/1/8 5:31:02

在这里插入图片描述
一、是什么
事件代理,俗地来讲,就是把一个元素响应事件(click、keydown…)的函数委托到另一个元素

前面讲到,事件流的都会经过三个阶段:捕获阶段 -> 目标阶段 -> 冒泡阶段,而事件委托就是在冒泡阶段完成

事件委托,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事件的是外层元素,而不是目标元素

当事件响应到目标元素上时,会通过事件冒泡机制从而触发它的外层元素的绑定事件上,然后在外层元素上去执行函数

举个粟子:
比如一个宿舍的同学同时快递到了,一种笨方法就是他们一个个去领取
较优方法就是把这件事情委托给宿舍长,让一个人出去拿好所有快递,然后再根据收件人一一分发给每个同学
在这里,取快递就是一个事件,每个同学指的是需要响应事件的 DOM元素,而出去统一领取快递的宿舍长就是代理的元素
所以真正绑定事件的是这个元素,按照收件人分发快递的过程就是在事件执行中,需要判断当前响应的事件应该匹配到被代理元素中的哪一个或者哪几个

二、应用场景

如果我们有一个列表,列表之中有大量的列表项,我们需要在点击列表项的时候响应一个事件

<ul id="list">
  <li>item 1</li>
  <li>item 2</li>
  <li>item 3</li>
  ......
  <li>item n</li>
</ul>

如果给每个列表项一一都绑定一个函数,那对于内存消耗是非常大的

// 获取目标元素
const lis = document.getElementsByTagName("li")
// 循环遍历绑定事件
for (let i = 0; i < lis.length; i++) {
    lis[i].onclick = function(e){
        console.log(e.target.innerHTML)
    }
}

这时候就可以事件委托,把点击事件绑定在父级元素ul上面,然后执行事件的时候再去匹配目标元素

// 给父层元素绑定事件
document.getElementById('list').addEventListener('click', function (e) {
    // 兼容性处理
    var event = e || window.event;
    var target = event.target || event.srcElement;
    // 判断是否匹配目标元素
    if (target.nodeName.toLocaleLowerCase === 'li') {
        console.log('the content is: ', target.innerHTML);
    }
});

还有一种场景是上述列表项并不多,我们给每个列表项都绑定了事件

但是如果用户能够随时动态的增加或者去除列表项元素,那么在每一次改变的时候都需要重新给新增的元素绑定事件,给即将删去的元素解绑事件

如果用了事件委托就没有这种麻烦了,因为事件是绑定在父层的,和目标元素的增减是没有关系的,执行到目标元素是在真正响应执行事件函数的过程中去匹配的

举个粟子:
下面html结构中,点击input可以动态添加元素

<input type="button" name="" id="btn" value="添加" />
<ul id="ul1">
    <li>item 1</li>
    <li>item 2</li>
    <li>item 3</li>
    <li>item 4</li>
</ul>

使用事件委托

const oBtn = document.getElementById("btn");
const oUl = document.getElementById("ul1");
const num = 4;

//事件委托,添加的子元素也有事件
oUl.onclick = function (ev) {
    ev = ev || window.event;
    const target = ev.target || ev.srcElement;
    if (target.nodeName.toLowerCase() == 'li') {
        console.log('the content is: ', target.innerHTML);
    }

};

//添加新节点
oBtn.onclick = function () {
    num++;
    const oLi = document.createElement('li');
    oLi.innerHTML = `item ${num}`;
    oUl.appendChild(oLi);
};

可以看到,使用事件委托,在动态绑定事件的情况下是可以减少很多重复工作的

三、总结

适合事件委托的事件有:click,mousedown,mouseup,keydown,keyup,keypress

从上面应用场景中,我们就可以看到使用事件委托存在两大优点:

  • 减少整个页面所需的内存,提升整体性能
  • 动态绑定,减少重复工作

但是使用事件委托也是存在局限性:

  • focus、blur这些事件没有事件冒泡机制,所以无法进行委托绑定事件
  • mousemove、mouseout这样的事件,虽然有事件冒泡,但是只能不断通过位置去计算定位,对性能消耗高,因此也是不适合于事件委托的

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

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

相关文章

MFA多因素认证:保护你的邮箱、VPN等账户免遭黑客入侵

多因素认证&#xff08;MFA&#xff09;是防范黑客攻击的重要防线之一。在密码被越来越容易被破解的情况下&#xff0c;多因素认证让你的账户更加安全。本文将详细讲解多因素认证是什么、如何工作以及如何设置多因素认证来保护你的账户。 什么是MFA多因素认证 简单地说&#xf…

AIGC+开放式社交,为年轻人注入了新的“Soul”?

5月21日全国助残日&#xff0c;Soul App举办了一场与众不同的线上公益活动&#xff0c;邀请视障用户担任“见习解忧师”&#xff0c;诉说世界更多角落“不完美”的故事&#xff0c;展示人生更多可能&#xff0c;传递温暖与爱。 参与此次派对的“见习解忧师”都是Soul平台上充满…

OTP动态口令身份认证的多种形式

密码无处不在&#xff0c;但却出了名的弱。因此需要新的工具和技术来减少或减轻账户被接管&#xff08;ATO&#xff09;的风险。OTP动态口令身份认证的主要目的就是要确保该用户的身份足够可信。现在&#xff0c;最常见的方法是通过增加某种认证令牌来提供MFA多因素认证。 令牌…

Linux:日志文件分析

日志文件的分类 1内核及系统日志 由系统服务syslog统一进行管理&#xff0c;日志格式基本相似 2 用户日志&#xff1a;记录系统用户登录及退出系统的相关信息 3 程序日志&#xff1b;由各种应用程序独立管理的日志文件&#xff0c;记录格式不统一 日志文件 日志保存位置&#…

day43_crud

一、CRUD (create, read (retrieve), update, delete) 增 查 改 删 1.1 代码规范 com.qf.功能名.类名 – com.qf.model.Xxx 实体类 com.qf.util.Xxx 工具类 com.qf.servlet.XxxServlet Servlet类,主要是做接收请求作出响应 com.qf.dao.XxxDao Dao类. Data Access Obje…

hive详解(二)

2 hive的两种访问方式 2.4.1 命令行的方式 在前面的操作中&#xff0c;我们都是通过cli的方式访问hive的。我们可以切身的体会到&#xff0c;通过cli的方式访问hive的不足&#xff0c;如&#xff1a;cli太过笨重&#xff0c;需要hive的jar支持。 2.4.2 HiveServer2模式 1.JD…

Flutter学习二:构建第一个Flutter App

目录 1 使用vsCode创建APP项目 1.1 创建项目 1.2 调试项目 2 使用AndroidStudio创建APP项目 2.1 创建项目 2.2 调试项目 1 使用vsCode创建APP项目 1.1 创建项目 查看>命令面板&#xff0c;输入Flutter&#xff0c;点击New Project >Application&#xff0c;按流程创…

MySQL--事务持久化原理探究

1 引言 如果让你来实现一下 MySQL 持久化的功能&#xff0c;你准备如何实现&#xff1f;如果不考虑性能&#xff0c;接口完全使用同步机制实现&#xff0c;好像也不会出现什么问题&#xff0c;可是不考虑性能是不现实的&#xff0c;IO操作多么耗时&#xff0c;每次写磁盘&…

2023第五届双态IT北京用户大会 | 一起见证云原生时代的数据魅力

2023年6月9日-11日&#xff0c;由ITSS分会指导&#xff0c;ITSS数据中心运营管理组、双态IT论坛联合主办&#xff0c;ITSS媒体组协办的“2023第五届双态IT北京用户大会”将于北京召开。 为了能够有更多专注细分领域、内容深入的分享和探讨&#xff0c;每一届都会和论坛成员一起…

ReID专栏(二)多尺度设计与应用

前言 多尺度流层可以更有效地提取多尺度信息&#xff0c;而基于显著性的学习融合层有利于重要特征通道的自动选择&#xff0c;因此MuDeep在学习鉴别模式方面很强大。其实这也是目前大多数深度学习任务发表论文的趋势&#xff0c;即多尺度、显著性特征的表示。 本教程禁止转载。…

OpenMMLab AI实战营第二期(2)MMPose初体验

根据MMPose的官方文档学习一下 MMPose文档地址&#xff1a;https://mmpose.readthedocs.io/zh_CN/latest/index.html 文章目录 1. 概述2. 安装2.1 创建conda环境并激活2.2 安装pytorch2.3 使用 MIM 安装 MMEngine 和 MMCV2.4 安装MMPose 3. 20 分钟了解 MMPose 架构设计3.1 总…

Typora导出pdf一直停留在导出界面

Typora导出pdf一直停留在导出界面 1. 因为修改临时文件夹地址导致的问题 尝试遍了网上的各种方法对我都没奏效。 但是用管理员权限在 C:\Program Files\Typora 下打开 typora.exe 发现可以正常导出 pdf。 结合这一点&#xff0c;加上最近频繁出现启动文件、文件夹没有权限的…

ES查询 too_many_clauses,maxClauseCount is set to 5000

一&#xff1a;语法执行背景 ES boo查询中过多的拼接bool导致报maxClauseCount is set to 5000 { "caused_by": { "type": "too_many_clauses","reason": "maxClauseCount is set to 5000" } } 查询DSL语句&#xff1a; { …

问题解决:微信开发者工具显示清除登录状态失败 TypeError: Failed to fetch [1.06.2303220][win32-x64]

问题&#xff1a; 在编译之前&#xff0c;会进行清除全部缓存操作&#xff0c;但是点击后出现清除清除登录状态失败。 清除登录状态失败 TypeError: Failed to fetch [1.06.2303220][win32-x64]原因&#xff1a; 未连接网络&#xff0c;或者被你连接的网络拦截。 解决&#xf…

基于 PaddleVideo 的花滑骨骼点动作识别 2s-AGCN

配置文件节点流配置文件 2s-agcn_ntucs_joint_fsd.yamlMODEL 字段DATASET 字段PIPELINE 和 INFERENCE 字段OPTIMIZER 字段 agcn2s.pygraph输入通道数 骨骼流 Dataset 和 Pipeline配置文件DATASETPIPELINE 源码skeleton.pyskeleton_pipeline.pyAutoPaddingSkeletonNormIdenSkete…

springboot+vue高校学科建设资源管理系统

本 1、数据库的构建&#xff1a;数据库需求分析根据所需要实现的功能&#xff0c;对其数据库的需求进行分析。 2、后台管理&#xff1a;网站后台是给管理员用作管理网站内容的操作界面&#xff0c;它是网站日常维护&#xff0c;网站内容操作的交互窗口&#xff0c;是完成网站后…

JS逆向系列之猿人学爬虫第9题-动态cookie2

文章目录 目标参数流程分析js代码Python调用测试目标 https://match.yuanrenxue.cn/match/9参数流程分析 二次请求cookie携带m 第一次请求响应内容格式化之后是这样的: < body > < script src = "/static/match/safety/match9/udc.js" > <

Axure教程—表格(中继器)

本文将教大家如何用AXURE中的中继器制作表格 一、效果介绍 如图&#xff1a; 预览地址&#xff1a;https://oc3e6a.axshare.com 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87854863?spm1001.2014.3001.5501 二、功能介绍 可以在表格中插入…

1729_c语言中全局变量与局部变量以及形参重名问题

全部学习汇总&#xff1a; GreyZhang/c_basic: little bits of c. (github.com) 欢迎路过的YUAN类朋友相互交流&#xff0c;以下是我的联系方式&#xff1a; Email&#xff1a;greyzhang126.com 微信&#xff1a;grey0612 C语言中烦人变量命名冲突时会有怎么样的处理机制&…

sql_server数据库入门学习(一)

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…