首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >浅谈JavaScript的事件(事件委托)

浅谈JavaScript的事件(事件委托)

作者头像
水击三千
发布于 2018-02-27 09:52:33
发布于 2018-02-27 09:52:33
1.2K01
代码可运行
举报
文章被收录于专栏:水击三千水击三千
运行总次数:1
代码可运行

  事件处理程序为Web程序提供了系统交互,但是如果页面中的事件处理程序太多,则会影响页面的性能。每个函数都是对象,都会占用内存,内存中对象越多,性能越差。需要事先为DOM对象指定事件处理程序,导致访问DOM的次数增多,会延迟整个页面的交互就绪时间。

  • 事件委托

  对事件处理程序过多的解决方案是使用事件委托。事件委托利用了事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。比如click事件会一直冒泡到document,也就是说我们只需为整个页面指定一个onclick事件处理程序,而不必为每个需要点击事件的元素单独添加。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 <ul id="ul1">
2             <li id="li1">111</li>
3             <li id="li2">222</li>
4         </ul>

  例如上面的代码,如果我们采用常规手段来添加事件处理程序,我们需要为每个li都添加事件。但是如果采用冒泡,我们只需要指定一个事件处理程序,并且能够实现同样的功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 var oUl = document.getElementById("ul1"); 
 2             EventUtil.addEvent(oUl, "click", function(ev) {    
 3                 var ev = EventUtil.getEvent(ev);    
 4                 var target = EventUtil.getTarget(ev);    
 5                 if(target.id == 'li1') {       
 6                     console.log("1");   
 7                 }
 8                 else if(target.id=="li2"){
 9                     console.log("2");
10                 }  
11             });

  上面的代码中,通过事件冒泡为ul1指定了事件处理程序,在我们单击li的时候通过事件冒泡也会触发该事件,并且能够通过target来获取当前单击的元素对象。通过元素id,为每个元素执行不同的if语句。

并不是所有的事件都适合使用事件委托,比较适用的事件是:mouseup、mousedown、click、keyup、keydown和keypress。虽然mouseover和mouseout也支持事件冒泡,但是如果使用事件委托则处理就比较麻烦,而且需要计算鼠标的位置以及元素的位置(当鼠标从一个元素移到其子节点,或者移出元素都会触发mouseout事件)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 var oUl = document.getElementById("ul1"); 
 2             EventUtil.addEvent(oUl, "mouseout", function(ev) {    
 3                 var ev = EventUtil.getEvent(ev);    
 4                 var target = EventUtil.getTarget(ev);    
 5                 if(target.id == 'li1') {       
 6                     console.log("1");   
 7                 }
 8                 else if(target.id=="li2"){
 9                     console.log("2");
10                 }  
11             });

  比如上面的代码,当鼠标移到li元素的时候会触发mouseout,鼠标移出ul元素的时候也会触发mouseout事件。

  • 移除事件处理程序

  前文已经讲过事件的添加以及事件的移除。对于页面的事件处理程序太多,会影响页面的性能,除了使用事件委托之外,还可以将一些事件移除。内存中留有的一些过时的用不到的事件处理程序也是造成Web页面和内存性能的主要问题。

  我们移除页面中的元素时候,可以通过removeChild和replaceChild方法,但有时候也会使用innerHTML来替换元素。如果某个元素有事件处理程序,通过innerHTML来替换,则事件处理程序依然存在,那么该事件处理程序已经使用不到,但是它也无法被回收,会一直占用内存空间。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 <div id="firstdiv">
2             <input type="button" id="btnadd" value="添加" />
3         </div>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 EventUtil.addEvent(document.getElementById("btnadd"),"click",function(event){
2                 document.getElementById("firstdiv").innerHTML="processing";
3             });

  上面的代码中为btnadd元素绑定了单击事件,单击的时候通过innerHTML移除了该元素,但是元素的事件处理程序并没有移除,依然留在内存中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 var callback =function(event){
2                 EventUtil.removeEvent(document.getElementById("btnadd"),"click",callback);
3                 document.getElementById("firstdiv").innerHTML="processing";
4             }
5             EventUtil.addEvent(document.getElementById("btnadd"),"click",callback);

  上面的代码,我们在元素移除之前,手动移除了元素的事件处理程序。这样确保内存中也移除了该事件处理程序,而从DOM中移除按钮也非常彻底。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-02-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
在软件开发领域,性能基准测试是确保软件系统高效、稳定运行的重要环节。它可以帮助你评估应用程序的性能,了解其在不同条件下的响应时间、吞吐量、资源利用率等。通过基准测试,你可以确定系统在处理特定工作负载时的性能表现。
追逐时光者
2024/11/28
2990
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
在软件开发领域,性能基准测试是确保软件系统高效、稳定运行的重要环节。它可以帮助你评估应用程序的性能,了解其在不同条件下的响应时间、吞吐量、资源利用率等。通过基准测试,你可以确定系统在处理特定工作负载时的性能表现。
郑子铭
2025/01/01
2870
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
【译】使用 Visual Studio Profiler 进行基准测试
在 Visual Studio 17.13 预览版中,我们发布了更新的 BenchmarkDotNet 诊断器,允许您使用性能分析器中的更多工具来分析基准测试。有了这个变化,可以非常快速地挖掘 CPU 使用情况和内存分配,从而使测量/修改/测量周期快速而高效。
郑子铭
2025/03/10
3400
【译】使用 Visual Studio Profiler 进行基准测试
C# 标准性能测试
经常我写一个类,作为一个工具类,小伙伴会问我这个类的性能,这时我就需要一个标准的工具进行测试。 本文告诉大家如何使用 benchmarkdotnet 做测试。
林德熙
2018/09/19
1.3K0
C# 标准性能测试
牛逼了!教你如何使用Pytest测试框架开展性能基准测试!
在软件开发中,性能测试和基准测试是确保软件质量不可或缺的一部分。今天,将给大家推荐一款强大的工具——pytest-benchmark,它能够帮助我们轻松地集成基准测试到我们的pytest测试套件中。
测试开发技术
2024/06/28
5990
牛逼了!教你如何使用Pytest测试框架开展性能基准测试!
基准测试工具:Wrk初识
最近和同事聊起常用的一些压测工具,谈到了Apache ab、阿里云的PTS、Jmeter、Locust以及wrk各自的一些优缺点和适用的场景类型。这篇文章,简单介绍下HTTP基准测试工具wrk的基本使用方法。。。
老_张
2019/12/02
9260
精选 10 个 C#/.NET 开发必备开源库!
xUnit 是一个开源、免费、以社区为中心的 .NET 单元测试框架,是用于 C# 和 F#(其他 .NET 语言可能也能运行,但未提供官方支持)进行单元测试的最新技术。xUnit 能够与 Visual Studio、Visual Studio Code、ReSharper、CodeRush 和 TestDriven.NET 兼容。它是.NET 基金会的一部分,并遵循其行为准则。
郑子铭
2025/08/06
2720
精选 10 个 C#/.NET 开发必备开源库!
Java基准测试工具JMH详解
JMH is a Java harness for building, running, and analysing nano/micro/milli/macro benchmarks written in Java and other languages targetting the JVM. JMH是一种Java工具,用于构建、运行和分析用Java和其他针对JVM的语言编写的nano/micro/mili/macro基准测试。
全栈程序员站长
2022/09/08
1.2K0
MySQL基准测试工具MySQLSlap使用实例
MySQLSlap是MySQL自带的基准测试工具,无需单独安装即可使用。下面记录一下在服务器上用 MySQLSlap做MySQL基本测试的步骤。
星哥玩云
2022/08/13
1.5K0
MySQL基准测试工具MySQLSlap使用实例
dotnet C# 在不同的机器 CPU 型号上的基准性能测试
本文将记录我在多个不同的机器上,在不同的 CPU 型号上,执行相同的我编写的 dotnet 的 Benchmark 的代码,测试不同的 CPU 型号对 C# 系的优化程度。本文非严谨测试,数值只有相对意义
林德熙
2024/06/16
4590
dotnet C# 在不同的机器 CPU 型号上的基准性能测试
Java基准测试工具JMH使用
JMH,即Java Microbenchmark Harness,这是专门用于进行代码的微基准测试的一套工具API。 JMH 由 OpenJDK/Oracle 里面那群开发了 Java 编译器的大牛们所开发 。何谓 Micro Benchmark 呢? 简单地说就是在 方法层面上的 benchmark,精度可以精确到微秒级。 本文主要介绍了性能基准测试工具 JMH,它可以通过一些功能来规避由 JVM 中的 JIT 或者其他优化对性能测试造成的影响。 Java的基准测试需要注意的几个点:
全栈程序员站长
2022/09/18
6640
Java基准测试工具JMH使用
Go 语言基准测试入门
之前在写 Java 的文章的时候,如果想在本地进行某段代码的性能测试(通常是对比另外一段或者几段),就会用到基准测试框架 JMH ,也的确非常好用。虽然我学习 Go 语言有一段时间了,对于基准测试还没有涉猎,下面就分享Go 语言的基准测试入门实践。
FunTester
2025/01/23
1110
Go 语言基准测试入门
精选 10 个 C#/.NET 开发必备开源库!
DotNetGuide专栏C#/.NET/.NET Core编程技巧练习集:C#/.NET/.NET Core编程常用语法、算法、技巧、中间件、类库、工作业务实操练习集,配套详细的文章教程讲解,助你快速掌握C#/.NET/.NET Core中各种编程常用语法、算法、技巧、中间件、类库、工作业务实操等等。
追逐时光者
2025/07/18
1170
精选 10 个 C#/.NET 开发必备开源库!
基准测试框架JMH使用详解
JMH即Java Microbenchmark Harness,是Java用来做基准测试的一个工具,该工具由OpenJDK提供并维护,测试结果可信度高。
全栈程序员站长
2022/09/14
7900
MySQL基准测试 转
基准测试是  指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。例如,对计算机CPU进行浮点运算、数据访问的带宽和延迟等指标的基准测试,可以使用户清楚地了解每一款CPU的运算性能及作业吞吐能力是否满足应用程序的要求;
wuweixiang
2018/08/14
2.3K0
MySQL基准测试
                                                                            转
【学习】性能基准测试:KVM大战Xen
在上周,我们对 KVM 和 Xen 近几年里在性能上的改进进行了一些有趣的探讨后,我打算自己做一些这方面的小研究。我能找到的最新的资料,是来自2013年 Phoronix Haswell 性能评测上的基准测试。当然,还有其它一些2011年的评测,不过由于 Xen 被收录进 Kernel 3.0,它们都已被热烈地讨论过。 2011年的测试提供了许多很好的基准报表,在三年后的现在,我尽最大努力把它们列出的属性重新测试一遍。但我删减了其中两三个基准测试,原因是它们在未经特定优化的配置后跑出来的数据不是很好,
小莹莹
2018/04/19
1.7K0
【学习】性能基准测试:KVM大战Xen
ASP.NET Core 6 的性能改进
受到 由Stephen Toub 发布的关于 .NET 性能的博客的启发,我们正在写一篇类似的文章来强调ASP.NET Core 在6.0 中所做的性能改进。
郑子铭
2022/03/22
2K0
ASP.NET Core 6 的性能改进
聊聊springboot项目如何利用jmh来进行基准测试
JMH(Java Microbenchmark Harness)是由OpenJDK团队开发的一个用于Java微基准测试工具套件,主要是基于方法层面的基准测试,精度可以达到纳秒级。它提供了一种标准、可靠且可重复的方式来衡量Java代码的性能,包括方法调用、对象创建以及其他类型的 JVM 级别的操作。JMH 通过生成优化过的字节码来确保基准测试不受常见陷阱的影响,如热身不足、垃圾回收干扰、编译器优化等,从而产生更准确的性能指标
lyb-geek
2024/07/09
3770
聊聊springboot项目如何利用jmh来进行基准测试
Linux 性能基准测试工具及测试方法
上篇文章 「什么?相同型号物理机 容器性能不如虚拟机?」 ,给我们的经验教训,就是上线前,基准测试的重要性,这篇文章着重介绍一下「Linux 性能基准测试工具及测试方法」
SRE运维进阶之路
2024/04/23
8520
Linux 性能基准测试工具及测试方法
了解 .NET 9 中的新增的包 Microsoft.AspNetCore.OpenApi
.NET9 剔除内置的 Swagger/Swashbuckle 组件,新增 Microsoft.AspNetCore.OpenApi 包。
郑子铭
2024/11/23
5830
了解 .NET 9 中的新增的包 Microsoft.AspNetCore.OpenApi
推荐阅读
相关推荐
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验