JavaScript事件代理(事件委托)

JavaScript事件代理(事件委托)基本概念事件代理 EventDelegat 又称之为事件委托 是 JavaScript 中常用绑定事件的常用技巧 顾名思义 事件代理 即是把原本需要绑定在子元素的响应事件 click keydown 委托给父元素 让父元素担当事件监听的职务 事件代理的原理是 DOM 元素的事件冒泡 举个通俗的例子比如一个宿舍的同学同时快递到了 一种方法就是他们一个个去领取 还有一种方

基本概念

事件代理(Event Delegation),又称之为事件委托。是JavaScript中常用绑定事件的常用技巧。顾名思义,“事件代理”即是把原本需要绑定在子元素的响应事件(click、keydown……)委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡。

举个通俗的例子

比如一个宿舍的同学同时快递到了,一种方法就是他们一个个去领取,还有一种方法就是把这件事情委托给宿舍长,让一个人出去拿好所有快递,然后再根据收件人一 一分发给每个宿舍同学;

在这里,取快递就是一个事件,每个同学指的是需要响应事件的 DOM 元素,而出去统一领取快递的宿舍长就是代理的元素,所以真正绑定事件的是这个元素,按照收件人分发快递的过程就是在事件执行中,需要判断当前响应的事件应该匹配到被代理元素中的哪一个或者哪几个。

事件冒泡

前面提到事件委托的原理是DOM元素的事件冒泡,那么事件冒泡是什么呢?

一个事件触发后,会在子元素和父元素之间传播(propagation)。这种传播分成三个阶段

JavaScript事件代理(事件委托)

如上图所示,事件传播分成三个阶段:

  • 捕获阶段:从window对象传导到目标节点(上层传到底层)称为“捕获阶段”(capture phase),捕获阶段不会响应任何事件;
  • 目标阶段:在目标节点上触发,称为“目标阶段”
  • 冒泡阶段:从目标节点传导回window对象(从底层传回上层),称为“冒泡阶段”(bubbling phase)。事件代理即是利用事件冒泡的机制把里层所需要响应的事件绑定到外层;

事件委托的优点

【1】可以大量节省内存占用,减少事件注册,比如在ul上代理所有li的click事件就非常棒

 
  
  • item 1
  • item 2
  • item 3
  • ......
  • item n
// ...... 代表中间还有未知数个 li

如上面代码所示,如果给每个li列表项都绑定一个函数,那对内存的消耗是非常大的,因此较好的解决办法就是将li元素的点击事件绑定到它的父元素ul身上,执行事件的时候再去匹配判断目标元素。

【2】可以实现当新增子对象时无需再次对其绑定(动态绑定事件)

假设上述的例子中列表项li就几个,我们给每个列表项都绑定了事件;

在很多时候,我们需要通过 AJAX 或者用户操作动态的增加或者删除列表项li元素,那么在每一次改变的时候都需要重新给新增的元素绑定事件,给即将删去的元素解绑事件;

如果用了事件委托就没有这种麻烦了,因为事件是绑定在父层的,和目标元素的增减是没有关系的,执行到目标元素是在真正响应执行事件函数的过程中去匹配的;所以使用事件在动态绑定事件的情况下是可以减少很多重复工作的。

基本实现

【1】JavaScript原生实现事件委托

比如我们有这样的一个 HTML 片段:

 
  

按照传统的做法,需要像下面这样为它们添加 3 个事 件处理程序

 var item1 = document.getElementById("goSomewhere"); var item2 = document.getElementById("doSomething"); var item3 = document.getElementById("sayHi"); item1.onclick = function() { location.href = "http://www.baidu.com"; }; item2.onclick = function() { document.title = "事件委托"; }; item3.onclick = function() { alert("hi"); };

如果在一个复杂的 Web 应用程序中,对所有可单击的元素都采用这种方式,那么结果就会有数不 清的代码用于添加事件处理程序。此时,可以利用事件委托技术解决这个问题。使用事件委托,只需在 DOM 树中尽量最高的层次上添加一个事件处理程序,如下面的例子所示

 var item1 = document.getElementById("goSomewhere"); var item2 = document.getElementById("doSomething"); var item3 = document.getElementById("sayHi"); document.addEventListener("click", function (event) { var target = event.target; switch (target.id) { case "doSomething": document.title = "事件委托"; break; case "goSomewhere": location.href = "http://www.baidu.com"; break; case "sayHi": alert("hi"); break; } })

【2】jQuery事件delegate()实现事件委托

delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。

格式:$(selector).delegate(childSelector, event, data, function)

参数 描述
childSelector 必需,规定要附加事件处理程序的一个或多个子元素。
event

必需,规定附加到元素的一个或多个事件。由空格分隔多个事件值。必须是有效的事件。

data 可选,规定传递到函数的额外数据。
function 必需,规定当事件发生时运行的函数。
 
   
    
    
    
  

使用事件委托注意事项

使用“事件委托”时,并不是说把事件委托给的元素越靠近顶层就越好。事件冒泡的过程也需要耗时,越靠近顶层,事件的”事件传播链”越长,也就越耗时。如果DOM嵌套结构很深,事件冒泡通过大量祖先元素会导致性能损失。

JavaScript事件代理(事件委托)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200979.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午10:12
下一篇 2026年3月20日 上午10:12


相关推荐

  • 开源剪映小助手(capcut-mate)v3.0.22发布

    开源剪映小助手(capcut-mate)v3.0.22发布

    2026年3月15日
    2
  • 圆通数据库泄露_数据库分析

    圆通数据库泄露_数据库分析今天的航空运单查询,其实质疑N快递单信息。版权声明:本文博主原创文章,博客,未经同意不得转载。转载于:https://www.cnblogs.com/mengfanrong/p/4808225.html…

    2026年1月24日
    3
  • AsyncTask理解

    AsyncTask理解AsyncTask 用法以下就是 AsyncTask 使用方法 AsyncTask 源码解析 asyncTask execute 执行开始初始化一个 AsyncTask 调用无参构造器实例化了一个 WorkerRunnab 对象 mWorker 实际是一个 Callable 实例化了一个 FutureTask 对象 mfuture 实际是一个 Runnable 传入参数 mWorker 这两个后面会用到然后 execute 方

    2026年3月16日
    1
  • lora协议不属于lpwan_哪种协议用于wan

    lora协议不属于lpwan_哪种协议用于wan考虑使用LoRaWAN部署您的物联网解决方案?倘若您正在开发用于工业或企业用途的专用网络解决方案,那么您需要了解此技术的一些限制(以及在许多情况下将为您提供更好服务的替代协议)。在本文中,我们将深入探讨:LoRa与LoRaWAN的区别LoRaWAN如何运作LoRaWANA,B和C类啁啾率,处理增益和正交性利用LoRaWAN构建专用网络的障碍另一种解决方案:SymphonyLinkLoRa与Lo…

    2022年10月7日
    4
  • Dialog中使用Printf

    Dialog中使用Printf

    2021年8月20日
    49
  • fdfs踩坑全记录

    fdfs踩坑全记录当我在使用 django 框架为后台管理 admin 页面自定义文件存储时 使用了 fastdfs 文件存储系统 但测试的时候报了很多错误 首先第一个 configparser NoOptionErro Nooption connect timeout insection config configparser 是 python 解释器读取配置文件的一个函数 这里的意思是它没有读取到配置文件中

    2026年3月26日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号