效率利器之事件委托

事件委托前端性能优化的秘密武器 事件委托 vs 逐个绑定 性能对比 阅读详情

前言

公司产品部推出了一款新产品,经理指派小A负责推广工作。小A通过多方打听了解到推广流程,需要使用公司证件在几个平台注册账号,并经过多轮审批。小A经历了一番操作后感到身心俱疲,最终成功将产品发布到公众平台上。

与此同时,公司的竞争部门也计划推出一款新产品。由于内部竞争关系,他们无法让小A协助推广。只能自己再注册一次。

时间过后,另一个部门X也面临类似的情况,老板觉得很繁琐,决定从公司层面成立宣传部,负责所有部门的宣传工作。

之后,任何部门有宣传的需求,都可以向上委托给宣传部,统一处理,提升了工作效率,减少了内部消耗

在现代Web开发中,当我们需要处理大量DOM元素的事件时,单个的事件绑定方式可能会导致代码冗长而难以维护,同时也会影响性能。幸运的是,JavaScript事件委托是一个优雅的解决方案,它可以优化代码结构并提升性能。让我们来深入了解什么是事件委托,以及如何应用它来改进我们的代码。

图片

什么是事件委托

事件委托是一种设计模式,它利用了事件冒泡的机制。当一个元素上的事件被触发时,它会向上冒泡传递至父级元素,直至最顶层的文

展开说说

事件委托是建立在事件冒泡机制之上的,冒泡是指事件从触发事件的元素开始,逐级向上触发所有上级元素的过程。

接下来,让我们欢迎千锋虎哥为我们表演一个胸口碎大石。见他气沉丹田后,发出一声咆哮,只听咔嚓一声...

图片


是的,编不下去了!

力量传递到第一层瓦片时,第二层、第三层,以及第n层依次受到力量的作用,就像事件冒泡的过程一样。

接着看这个图

图片

在鼠标点击div1时,力量会逐级传导到div2上,然后继续传导到div3,一直延伸至body,最终到达window。只要在对应的元素上设置了点击事件,该事件就会被触发,并且按照冒泡的顺序依次传递至父级元素

那么好,需求来了,现在需要div点击的时候,缩小自己的宽和高,每次缩小到自己的百分之90,看效果

图片

第一个想到的方案是为每个元素添加点击事件,并需要阻止事件冒泡(自行查阅阻止冒泡)。


    const div1 = document.querySelector('.div1')
    const div2 = document.querySelector('.div2')
    const div3 = document.querySelector('.div3')

    div1.addEventListener('click', (e) => {
      div1.style.width = parseInt(window.getComputedStyle(div1).width) * 0.9 + 'px'
      div1.style.height = parseInt(window.getComputedStyle(div1).height) * 0.9 + 'px'
      e.stopPropagation() //阻止冒泡
    })
    div2.addEventListener('click', (e) => {
      div2.style.width = parseInt(window.getComputedStyle(div2).width) * 0.9 + 'px'
      div2.style.height = parseInt(window.getComputedStyle(div2).height) * 0.9 + 'px'
      e.stopPropagation() //阻止冒泡
    })
    div3.addEventListener('click', (e) => {
      div3.style.width = parseInt(window.getComputedStyle(div3).width) * 0.9 + 'px'
      div3.style.height = parseInt(window.getComputedStyle(div3).height) * 0.9 + 'px'
      e.stopPropagation() //阻止冒泡
    })

这代码看着挺冗余啊,再提炼提炼,既然每个div触发的事件都相同,能不能使用一个函数处理呢,可以的,接着看


    const div1 = document.querySelector('.div1')
    const div2 = document.querySelector('.div2')
    const div3 = document.querySelector('.div3')
    function changeSize(e) {
      e.target.style.width = parseInt(window.getComputedStyle(e.target).width) * 0.9 + 'px'
      e.target.style.height = parseInt(window.getComputedStyle(e.target).height) * 0.9 + 'px'
      e.stopPropagation()
    }
    div1.addEventListener('click',changeSize)
    div2.addEventListener('click',changeSize)
    div3.addEventListener('click',changeSize)

确实简洁了不少。顺便说说e.target,指哪个元素触发了事件,e.target就是哪个元素对象

那能不能再简洁一点呢,既然有了冒泡。那div1、2点击的时候,冒泡到div3上,只给div3做个点击事件,是不是也行?来看看代码


const div3 = document.querySelector('.div3')
div3.addEventListener('click', (e) => {
      e.target.style.width = parseInt(window.getComputedStyle(e.target).width) * 0.9 + 'px'
      e.target.style.height = parseInt(window.getComputedStyle(e.target).height) * 0.9 + 'px'
      e.stopPropagation()
})

是不是x格一下子就高上来了,这种操作就叫做事件委托,把div1、div2事件委托给div3处理

这是工作摸鱼、提升效率之利器

事件委托的优缺点

优点:
● 减少事件处理程序的数量:通过将事件绑定在父元素上,可以避免给每个子元素都添加事件处理程序。这在处理大量元素时可以显著减少代码的复杂性和维护成本。
● 动态添加元素支持:对于后续动态添加的子元素,无需单独为它们添加事件处理程序,因为事件委托是基于父元素的,新添加的元素也会受到委托的处理。
● 内存和性能优化:事件委托利用事件冒泡的特性,将事件处理放在父元素上,避免了在每个子元素上都绑定事件,从而节省内存和提高性能。
● 方便绑定动态元素:当页面中存在大量元素时,事件委托可以方便地处理动态添加的元素,无需为新元素单独添加事件监听。

缺点:
● 事件冒泡带来的潜在问题:由于事件冒泡的特性,事件委托可能导致事件在父元素上被多次触发,这可能会影响性能和产生不良影响。为了避免这个问题,需要在事件处理程序中正确判断事件源。
● 不适用于所有情况:并非所有事件都适合使用事件委托。例如,如果需要在不同阶层的元素上绑定不同的事件处理程序,或者需要对事件进行捕获阶段的处理,事件委托可能无法满足需求。
● 事件目标确定:在事件委托中,需要通过事件对象的target属性来确定真正的事件目标,这可能会涉及到一些复杂的逻辑。

总结:

总体来说,事件委托是一种非常有用的技术,特别适合处理大量元素的事件处理。它可以提高代码效率、减少内存占用,并且方便处理动态添加的元素。然而,需要注意避免潜在的问题,以确保事件委托的正确使用。

纯CSS实现轮播图 纯CSS实现轮播图 各位小伙伴们,今天我们来学习一下轮播图。轮播图是我们写网页当中经常出现的一个效果,基本上各个网站上都会有这个效果。那么一提到轮播图大家脑子里的第一反应是不是用js来实现呀。 那今天这篇文章呢我们就不按常理出牌,不用js来写轮播图,而是利用纯css实现轮播图,听起来是不是很厉害的样子,纯css竟然能写出轮播图的效果,那么到底应该怎么写呢?接下来废话不多说,上代码。 最后实现的效果: html代码 <!-- slide是轮播图区域 --> <div class=" 阅读详情

相关推荐

QMT量化交易实战:如何用通达信预警数据自动买卖股票(附完整Python代码)

本文详细介绍了如何利用QMT平台对接通达信预警数据,构建自动化股票交易系统。通过完整的Python代码示例,展示了从数据获取到订单执行的全流程,帮助投资者实现量化交易策略的自动化执行,提升交易效率

weixin_29234423的博客 169

深入探讨 C# 委托事件与 Lambda 表达式:架构设计与高效编程的核心利器

委托的定义需要使用delegateC# 的委托事件和 Lambda 表达式是强大的工具,能够帮助开发者在构建高效、可维护的系统时简化代码、解耦组件并提升程序的灵活性。通过委托,程序可以实现回调和多播操作;通过事件,开发者可以实现松耦合的发布/订阅机制;通过 Lambda 表达式,代码变得更加简洁并具备函数式编程的特性。掌握这些概念并将其应用到实际项目中,不仅能够提升开发效率,还能在面对复杂的架构设计时,保证系统的可扩展性和可维护性。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1336

华为P30/pro (ELE-AL00) 鸿蒙4.2降级 EMUI 9

分享

m0_52356707的博客 1万+

C#代码解耦利器委托事件(Delegate & Event)从入门到实践 (Day 23)

在前一天的学习中,我们探讨了如何通过异常处理和调试来增强代码的健壮性。今天,我们将深入 C# 的一个核心特性——委托(Delegate)和事件(Event)。它们是实现事件驱动编程和代码解耦的强大武器,对于构建灵活、可维护的系统(尤其是在像 Unity 这样复杂的开发环境中)至关重要。理解委托事件,能让你在不同模块间建立松耦合的通信机制,告别“牵一发而动全身”的窘境。从本质上讲,委托(Delegate)是一种引用类型,它可以“持有”

吴师兄大模型的博客 1371

提升jQuery事件委托速度的利器 —— SelectorSet补丁

提升jQuery事件委托速度的利器 —— SelectorSet补丁 在前端开发领域,我们常常追求性能的极限,尤其是在处理大型Web应用时。今天,我们要介绍一个能够显著提升jQuery事件委托效率的开源项目——jQuery SelectorSet patch。这个小而美的工具利用了SelectorSet库,为你的网页交互带来轻量级的速度飞跃。 项目介绍 jQuery SelectorSet pat...

gitblog_00095的博客 349

多播委托:MulticastDelegateSwift —— 简化你的Swift事件处理

多播委托:MulticastDelegateSwift —— 简化你的Swift事件处理 在Swift的世界里,事件处理和委托设计模式是构建健壮应用的关键。然而,传统的单一委托方式有时显得力不从心,尤其是在多个对象需要响应同一事件的场景下。为了解决这一痛点,我们有了一位新朋友——MulticastDelegateSwift,一个优雅且带有单元测试的多播委托实现。 项目介绍 MulticastDel...

gitblog_00223的博客 802

C Socket异步通信事件委托通信程序与界面分离:提升网络通信性能的利器

C# Socket异步通信事件委托通信程序与界面分离:提升网络通信性能的利器 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在当今网络通信技术迅猛发展的时代,提高通信效率和降低程序耦合度是每个开发者的追求目标。CSocket异步通信事件委托通信程序与界面分离项目,正是基于这一目标,利用C#语言特性,实现了高效的网络通信与模块化设计。 项目技术分析 Socket异步...

gitblog_06713的博客 1046

C#委托事件:从回调机制到事件驱动架构的核心原理与实战

在面向对象编程中,回调机制是实现模块间解耦和异步通信的基础技术。其核心原理是通过将方法作为参数传递或存储,允许程序在特定时机调用预先定义的操作,从而实现关注点分离。这一机制的技术价值在于提升代码的灵活性和可扩展性,是构建松耦合、高内聚系统的关键。在C#语言中,委托作为类型安全的函数指针,为回调提供了标准化实现;而事件则基于委托,通过封装和访问控制,构建了安全的发布-订阅模型。这种模型广泛应用于桌面UI开发(如WPF/WinForms的事件处理)、插件系统、日志框架和异步编程等场景。本文深入探讨了C#委托与事

weixin_34152820的博客 772

懂了委托,才算真正入门C#

委托这个名字取的神乎其神的,但实质是函数式编程,把函数作为参数传递给另一个参数,在图形界面编程中非常常用,是控件绑定动作的基本方法。

微小冷的学习笔记 4614

C#委托事件:从核心原理到实战解耦架构设计

在软件工程中,解耦是提升代码可维护性和可扩展性的核心设计原则,它通过降低模块间的直接依赖来应对变化。其实现原理常基于观察者模式,即发布-订阅机制,让发布者与订阅者通过抽象契约进行通信,而非硬编码调用。这一技术价值在于构建出灵活、可复用的系统架构,广泛应用于桌面应用UI交互、插件系统、微服务间异步通信等场景。C#语言内置的委托事件机制,正是这一思想的优雅实现。委托作为类型安全的函数指针,定义了能力契约;事件则在其基础上提供了封装良好的发布-订阅模型。本文深入探讨了如何运用委托事件,并结合事件聚合器等高级模

weixin_33797791的博客 298

如何在React项目中使用ECharts图表库

如果在原生的JS应用或者jQuery项目中,我们常用的方式就是直接去官网下载其核心js文件并导入我们的项目中使用,但是在React项目中,我们大可不必,由于React项目开发基于webpack做了二次封装,而webpack又是基于 Node.js的前端项目部署打包工具,总而言之,React项目开发是在nodejs环境基础上,所以可以直接利用npm包管理器将第三方工具模块下载加入到项目中,并通过import引入对应的模块到相关页面中使用,不需要关心其中的细节。1、通过极坐标双数值轴绘制爱心。

sdasadasds的博客 1万+

教你js生成二维码-QrCodeJS

通过 QECode.js 可以非常方便的在web 页面中使用二维码。让我们在应用中便捷的使用,扩展了项目的适用范围。提升项目的用户体验,使我们的应用更加符合当下用户的适用习惯,增加用户的黏性。二维码又称QR Code,是一个近几年来移动设备上很流行的一种编码方式它比传统的一维码(条形码)能存更多的信息,也能表示更多的数据类型。按照一定规律排列组成的几何图形构成,它巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念。人们的生活方方面面都离不开二维码,而且她也给人们带来了极大的便利。

sdasadasds的博客 8648

一篇文章带你了解Nodejs

1.什么是node.js? node.js是一个基于Chrome v8引擎的javascript 运行环境。Node.js使用了一个事件驱动、非阻塞式 I/O的模型,使其轻量又高效。(由c++语言编写的)Node.js的包管理器npm,成为世界上最大的开放源代码的生态系统。 简单说:编写高性能网络服务器的javascipt工具包(用于js开发服务端程序) 单线程、异步、事件驱动。node.js是一个Javascript运行环境(runtime)Node.js 是一个让 JavaScript 运行在服务端的开

sdasadasds的博客 8270

深入了解word-break和 word-wrap的区别

我们知道,本次内容主要是“深入了解 word-break:break-all和 word-wrap:break-word的区别”,这2个属性都是属于CSS3的属性,在现在很多文本模块用到很多,故此写了这篇文章,和大家交流学习。首先我们来了解一下word-break这个属性,它的语法如下: 它的属性值一共有3个,其中的几个属性值的含义具体解释如下:normal:表示默认值,即默认的的换行规则。 break-all:表示强行换行,意思就是允许任意非文本间(比如网址类型的等)的单词断行。 keep-all: 也表

sdasadasds的博客 7659

微信小程序接入直播

文章目录微信小程序接入直播一.小程序配置1.添加/更改服务类目2.开通实时播放/录制音视频流二.云直播服务器1.云直播申请2.云直播配置2-1添加域名2-2获取推流地址2-3获取播放地址三.组件介绍1.live-pusher2.live-player四.代码实现1.页面结构2.离线检测 微信小程序接入直播 ​ 作者:kerwin 微信小程序开发如火如荼,很多公司都构建了自己的小程序。对于一些有产品的公司, 他们对于自己的小程序有直播需求,希望通过小程序直播获得流量变现。本文章就此需求,跟大家聊聊如何在

sdasadasds的博客 7169

前端,后端,全栈哪个好找工作?

也就是说,我们不可能轻轻松松就变成【真·前端】或【真·后端】,两者背后都是需要付出极大的耐心去付出、去成长。通过上面分析我们就会感觉到,这个问题本质不在于哪个好找工作,本质在于,我们的精力到底允许我们达到哪一步?意思就是说,如果这三者你都达到了真正意义上的企业用人标准,那毫无疑问【真·全栈】是最好找工作的。所以,与其站在十字路口不停徘徊,更好的做法是选一个自己感兴趣的方向,拿起键盘先干起来。只有我们先变成了【真·前端】、【真·后端】,我们才有可能变成【真·全栈】。前端很溜,后端很溜,这是【真·全栈】

sdasadasds的博客 5238

前端基础知识点:JS中的参数传递详解

如图所示,18的空间是真正存储数据的空间(new出来的堆空间),20是存储真正数据所在空间的地址。(如下图)假设实参a的地址18,实参b的地址为19。形参x和y的值确实进行了交换,但是由于形参与实参是不同的空间,所以形参x,y的改变,是无法影响到实参a,b的。先说结论,JS只有值传递,没有引用传递。地址就是内存中的一个编号,等价于我们常说的引用ID(引用ID是优化后的地址)。有,当传递的实参为引用类型时,可以通过形参改变实参所指向空间的数值。单向传递,只能将实参的数值传递给形参,不能将形参的值传递给实参。.

sdasadasds的博客 5008

Vue实现全局异常处理的几种方案

在开发组件库或者插件,经常会需要进行全局异常处理,从而实现:那么如何实现上面功能呢?本文先简单实现一个异常处理方法,然后结合 Vue3 源码中的实现详细介绍,最后总结实现异常处理的几个核心。本文 Vue3 版本为 3.0.11一、前端常见异常对于前端来说,常见的异常比较多,比如:等等最常用的比如:通过 window.onerror文档[2]可知,当 JS 运行时发生错误(包括语法错误),触发 window.onerror(): 函数参数:若该函数返回true,则阻止执行默认事件处理函数。另外,我们也经常会使

sdasadasds的博客 4437

15 个常见的 Node.js 面试问题及答案

15 个常见的 Node.js 面试问题及答案 俗话说:临阵磨枪,不快也光。对于成功的编程面试来说,准备和知识面一样重要。准备使你有信心参加面试,而不用担心莫名的紧张情绪。如果第一次参加编程面试,这一点尤其重要。 为帮助 Node.js 开发人员更好的面试,列出了 15 个常见的 Node.js 和网络开发相关的面试问题。 在本文中,我们将重点讨论 Node.js 相关问题。但是,请记住 JavaScript 问题在 Node.js 面试中也经常问到,所以准备一些对你来说没什么坏处。 现在,让我们深入了解面

sdasadasds的博客 4056

用户打开你的页面,一片空白,什么都不显示,原因可能是什么呢?

在用户端会默认缓存 index.html 入口文件,而由于构建工具(比如Webpack,rollup等)在每次代码更新后,打包生成的css/js文件名都带有哈希值,跟上次的文件名都不同,因此会出现找不到 css/js 文件的情况,导致白屏的产生。常用框架,比如 Vue React Angular 都是依靠JS进行驱动的,在渲染页面的时候需要加载很大的JS文件,在JS解析加载完成之前无法展示页面,从而导致了白屏。第一个打开的页面,如果请求一个缓慢的后端接口,引发JS阻塞,导致页面白屏。● 前端JS代码问题。

sdasadasds的博客 3930

基于激光SLAM和深度学习的语义地图构建.pdf

基于激光SLAM和深度学习的语义地图构建.pdf

上一篇: JSON:让数据传输更优雅
下一篇: 小霸王其乐无穷之函数回调
千锋HTML5大前端
博客等级 码龄7年 397粉丝 · 414原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值