当前位置:首页 > CN2资讯 > 正文内容

JS事件代理

2天前CN2资讯

事件代理

事件代理,就是把一个元素响应事件(click、keydown......)的函数委托到另一个元素

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

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

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

应用

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

<ul id="list"> <li>item 1</li> <li>item 2</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); };

可以看到,使用事件委托,可以减少很多重复工作的

优点

事件委托的优点:

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

局限性

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

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

如果把所有事件都用事件代理,可能会出现事件误判,即本不该被触发的事件被绑定上了事件

结语

本文到此结束,谢谢大家的观看!

如有问题,欢迎各位指正!

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24451.html

    分享给朋友:

    “JS事件代理” 的相关文章

    Discover What is vip.qq.com: Unlock Exclusive QQ Member Benefits

    vip.qq.com简介 vip.qq.com是腾讯公司专门为QQ会员用户打造的官方网站。这个平台为会员提供了一系列专属的特权和服务,涵盖了社交、游戏、生活等多个方面。作为QQ会员的官方入口,vip.qq.com不仅是会员管理账户的中心,也是了解和使用各种会员功能的主要渠道。无论是等级加速、身份铭牌...

    深入解析APT攻击及其主要案例分析

    在网络安全的领域,APT攻击近年来引起了广泛关注。这种高级持续性威胁(APT)通常是由高度专业化的攻击者发起,针对特定目标进行长期、隐蔽的攻击。APT攻击的目标通常是国家级别的机构、企业、科研单位等,它们的攻击方式不仅难以检测,而且往往具有明显的目的性。 回顾APT攻击的历史,我们可以发现其起源与发...

    如何选择合适的Windows VPS服务: 实用指南与推荐

    在寻找合适的Windows VPS服务时,了解主要服务商的特点无疑是一个重要的步骤。市面上众多提供Windows VPS服务的商家中,vpsdime.com、raksmart.com、ion.krypt.asia以及bacloud.com等都是值得考虑的选择。这些服务商在多个地区运营,提供了不同版本...

    OVH云服务概述:高性价比的VPS与专用服务器解决方案

    OVH概述 谈到云服务提供商,OVH无疑是一个引人注意的名字。这家成立于1999年的法国公司,总部位于鲁贝,已经从当初的小公司发展成为全球领先的云服务平台。OVH不仅为个人和企业提供各种云计算解决方案,还持续推动技术创新,满足越来越多用户的需求。 OVH拥有广泛的服务网络,分布在北美、欧洲、亚洲和非...

    便宜日本VPS的选择与比较:性价比高的供应商推荐

    在当今数字化时代,VPS(虚拟专用服务器)正成为许多企业和个人的首选解决方案,尤其是在日本市场。对于那些需要可靠网络服务的用户来说,这无疑是一个非常实用的选择。日本的VPS服务以其高性能和稳定性著称,深受开发者、小型企业、网站管理员等用户的喜爱。 日本VPS的定义并不复杂,简单来说,它是一种虚拟化技...

    如何有效购买和使用代理IP服务,满足多种需求 - IP够卖指南

    在我们开始讨论“IP够卖”的购买与应用流程之前,理解购买渠道的多样性非常重要。很多人可能会问,究竟从哪里可以获取到合适的代理IP?实际上,有几种渠道可以选择,适合不同需求的用户。 首先,专业代理服务商无疑是最推荐的选择。这类服务商通常提供稳定且高质量的代理服务,能满足诸多使用场景,比如数据爬虫、电商...