效率利器之事件委托

news2024/10/7 2:26:34

前言

公司产品部推出了一款新产品,经理指派小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属性来确定真正的事件目标,这可能会涉及到一些复杂的逻辑。

总结:

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

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

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

相关文章

GB:重测序+转录2023经典文章,一篇就够

在三代测序崛起的现在,HiFi Reads以其超长读长,高准确率及灵敏度、GC偏向性小、无PCR偏向性等特色优势在动植物基因组、微生态领域等研究中正崭露头角,成为组学研究技术的新热门。高品质的HiFi Reads成为攻克动植物基因组组装难点的有力助推&…

SNAP插件sen2Three去云操作

1.先把这篇文章看了 2.去官网下载Sen2Three 3.这时候可以大概看看Sen2Three的官方文档,我们知道了需要用anaconda2环境 4.我是已经安装有anaconda3,所以需要两个并存,此时可以参考这篇文章 5.这是ananconda2的链接,直接下载安装即可&#xff…

南卡签约游泳冠军傅园慧,创造防水运动耳机的新天花板!

近日,国内骨传导运动耳机龙头品牌NANK南卡,正式官宣知名游泳冠军傅园慧出任品牌形象大使。在此之外,南卡品牌方还特邀了同样作为游泳冠军的孙杨,以及知名演员张新成、流行歌手段奥娟等多位明星来体验旗下的运动耳机,皆…

Python中搭建IP代理池的妙招

在Python的爬虫世界里,你是否也想搭建一个功能强大的IP代理池,让你的爬虫无忧无虑地畅游各大网站?今天,我就来教你使用Scrapy框架搭建IP代理池,让你的爬虫更加智能、高效!跟着我一步一步来,轻松…

天津最新python培训班就业形势 python能就业吗?

小编认为Python是一门非常适合学习的编程语言,无论性别如何。它易于学习、功能强大,并且在各个领域都有广泛的应用,因此,性别不应该成为学习Python的障碍,那么学习Python是否就能找到满意的工作呢? 这是一…

PyTorch深度学习实战(10)——过拟合及其解决方法

PyTorch深度学习实战(10)——过拟合及其解决方法 0. 前言1. 过拟合基本概念2. 添加 Dropout 解决过拟合3. 使用正则化解决过拟合3.1 L1 正则化3.2 L2 正则化 4. 学习率衰减小结系列链接 0. 前言 过拟合 (Overfitting) 是指在机器学习中,模型…

问题解决方案

前端开发 1、npm安装的时候老是卡住 reify:rxjs: timing reifyNode:node_modules/vue/cli/node_modules 查看当前使用的那个镜像 nrm lsnpm ---------- https://registry.npmjs.org/yarn --------- https://registry.yarnpkg.com/cnpm --------- https://r.cnpmjs.org/taobao …

推荐系统工作小结

最初的构想 由于我们的技术团队中并没有人真正用大数据的方法做过推荐系统。所以我们定的步骤是先解决有没有的问题。然后再持续地进行效果优化的工作。 现状 但一方面考虑到要快速上线。另一方面也希望对推荐系统的效果有一个合理的参照。我们打算先使用达观数据的推荐系统云…

无涯教程-Perl - endpwent函数

描述 此功能告诉系统您不再希望使用getpwent从密码文件读取条目。在Windows下,使用Win32API::Net函数从域服务器获取信息。 语法 以下是此函数的简单语法- endpwent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perlwhile(($name, $pas…

不知道ai绘画工具有哪些?那就赶紧把这些AI绘画工具收藏下来

近年来,AI技术的发展很快,在很多领域都取得了新的进展,这其中也包括了绘画领域。 最近,我看到了几幅用AI生成的图片,被深深地吸引住了。 所以,我就去找了几个AI绘画工具尝试制作AI图片。 尝试完之后发现…

论文解读|使用深度卷积网络的图像超分辨率

原创 | 文 BFT机器人 论文标题:Image Super-Resolution Using Deep Convolutional Networks 网址:https://arxiv.org/abs/1501.00092 代码:https://github.com/Edwardlzy/SRCNN 01 摘要 提出了一种单幅图像超分辨率(SR&#x…

docker菜谱

DockerHub:https://hub.docker.com/ 记录docker常用软件安装,欢迎大家投稿。😎😎😎 文章目录 1. Redis 1. Redis 1、下载redis镜像: docker pull redis:6.2.8 docker pull redis:7.0.02、启动容器&#x…

python入门篇01- 安装python必备环境和helloworld书写

目录 1. 前言简介 1.1 python简介: 1.1.1 Python是一种高级编程语言, 1.1.2 Python的命名是受到了英国喜剧团体Monty Python的启发。 1.1.3从1990年开始,Python获得了一些用户 1.2 python与java的区别 2. python书写helloworld 2.1 安装pytho…

pytorch求导

pytorch求导的初步认识 requires_grad tensor(data, dtypeNone, deviceNone, requires_gradFalse)requires_grad是torch.tensor类的一个属性。如果设置为True,它会告诉PyTorch跟踪对该张量的操作,允许在反向传播期间计算梯度。 x.requires_grad 判…

选择移动CRM需必备哪几大功能?

随着信息技术的飞速发展,移动CRM成为企业数字化转型的必备工具。本文将探讨移动CRM主要功能有哪些?帮助大家在CRM选型中少走弯路,认识移动CRM可以做哪些事。 1.整合客户数据 移动CRM的首要功能是帮助企业轻松采集和整合客户数据。通过移动设…

基于Java+SpringBoot制作一个智能用电小程序

在当今快节奏的生活中,高效利用能源变得越来越重要。制作一个智能用电小程序,旨在帮助您更智能地管理家庭电器的用电,从而提升能源利用效率,助您掌握用电情况,降低能耗成本,实现绿色低碳生活。 目录 一、小程序1.1 项目创建1.2 首页轮播图快捷导航iconfont图标引入

【LeetCode 75】第二十三题(2352)相等行列对

目录 题目: 示例: 分析: 代码运行结果: 题目: 示例: 分析: 题目很简洁,就是要我们寻找行与列相同的对数。相同行与列不仅是要元素相同,还需要顺序也一样&#xff08…

Apipost接口自动化测试入门

今天我们来聊一聊接口自动化测试。以往我们都是以以代码的形式编写自动化测试脚本做自动化测试,网上也有非常多的攻略,那么在不会代码的情况下该怎么做接口自动化呢,今天给大家介绍Apipost自动化测试模块,不用写代码也能做接口自动…

ROS获取IMU的数据

消息格式 上ROS官网查看👉ROS ROS官网给定的主题,一般我们使用第二个。   实现思路 (1)maweiUbuntu:~/catkin_ws/src$ catkin_create_pkg imu_pkg roscpp rospy sensor_msgs 实现代码👇   //imu_node.cpp #in…

云知识库软件的推荐清单,你看看你喜欢哪一个?

在选择云知识库软件时,有很多因素需要考虑,如功能、易用性、可定制性、安全性、价格等。下面是一些我喜欢的云知识库软件推荐清单: Confluence: Confluence是一款由Atlassian开发的知识管理和协作工具。它提供了强大的编辑和协作…