javascript事件监听与事件委托

事件监听与事件委托

在js中,常用到element.addEventListener()来进行事件的监听。但是当页面中存在大量需要绑定事件的元素时,这种方式可能会带来性能影响。此时,我们可以用事件委托的方式来进行事件的监听。

每个事件都经历三个阶段

  • 捕获
  • 到达目标
  • 冒泡

事件委托需要用到事件的冒泡,冒泡就是事件发生时,上层会一层一层的接收这个事件。

如下页面结构:

<body><div id="div1"><div id="div2"><button>按钮</button></div></div>
</body>

当点击按钮,首先button接收到事件,然后向上层冒泡,接着id="div1"接收到事件,接着是id="div2",一直到达document的顶层。

所以可以添加一个事件处理器到父级,由他接收所有子节点的事件信息。这就是事件委托。

事件监听与事件委托性能比较

通过构建若干个button元素,并为其绑定事件监听器来比较事件监听与事件委托的性能。

1.构建若干个button元素,并添加到body中

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title></title>
</head>
<body id='body'><script type="text/javascript">var body = document.getElementById('body');var fragment = document.createDocumentFragment();for (var i = 0; i < 100; i++) {var btn = document.createElement('button');btn.id = i;btn.className = 'btn';btn.type = 'button';btn.innerText = '按钮'fragment.appendChild(btn);}body.appendChild(fragment);</script>
</body>
</html>

此时页面生成了100个按钮,id为0到99,class'btn'fragment是一个文档片段,相比较下面这种代码的好处是

for(var i = 0;i<100;i++){var btn=document.createElement('button');body.appendChild(btn);
}

前者页面只重排一次,后者页面重排了100次;所以若遇到大模块添加dom时,最好使用fragment

2.为button绑定事件监听器,并设置时间戳

    var btn = document.querySelectorAll('.btn');var date1 = new Date();for (var i = 0; i < btn.length; i++) {(function(i) {btn[i].addEventListener('click', function() {console.log(i);});})(i)}

3.给body绑定click事件,实现事件的委托

    var date2 = new Date();body.addEventListener('click', function(e) {var element = e.target;if (element.className == 'btn') {console.log(element.id);}})var date3 = new Date();

下面我们来通过时间戳分析一下这两种方式的性能。

console.log(date2 - date1);
console.log(date3 - date2);

通过改变button的数量,得到以下数据(单位:ms):
在360兼容模式下:

  • 当button数量为100时,平均为 6 0
  • 当button数量为400时,平均为 20 0
  • 当button数量为1000时,平均为 48 0

在新版谷歌下:

  • 当button数量为1000时,平均为 3 0

可见当页面中有大量元素需要绑定事件时,并不是所有的事件都会被触发,而这时对所有需要监听的元素都绑定事件处理器无疑是要花费代价的,而通过事件委托的方式可以很好的解决性能问题,不需要为每个元素都绑定事件监听器。但是要写一些逻辑代码来判断事件源。所以,如果你的web项目对性能要求极为苛刻,事件委托也不失于一种优雅的选择

转载于:https://www.cnblogs.com/smartXiang/p/6218716.html

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

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

相关文章

串口打印怎么使用】_爱普生打印机怎么使用 爱普生打印机使用方法【详解】...

市面上的打印机品牌有很多&#xff0c;其中就有爱普生打印机&#xff0c;这个品牌的打印机是在上个世纪的四十年代成立的&#xff0c;并且爱普生这款打印机逐渐深入我们的生活&#xff0c;一般我们很多都会使用爱普生打印机来打印资料或者是下载各种工作材料&#xff0c;那么你…

中科院大学计算机研究生考试大纲,中国科学院大学《计算机原理》2019年硕士研究生入学考试大纲...

(二)计算机组成原理 (50分)1、计算机系统概论(1)计算机的分类。(2)计算机的硬件。(3)计算机的软件。(4)计算机系统的层次结构。2、 运算方法和运算器(1)数据与文字的表示方法。(2)定点加法、减法运算。(3)定点乘法运算。(4)定点除法运算。(5)定点运算器的组成。(6)浮点运算方法…

linux 测试cpu计算圆周率_Linux下测试CPU性能

一、安装stress服务2、解压tar xvf stress_1.0.1.orig.tar.gz3、进入解压目录执行./configure4、make5、make check6、make install7、make clean二、安装sysstat服务2、解压tar xvf sysstat-11.5.6.tar.gz3、进入解压目录执行./configure4、make & make install三、测试C…

日益谨慎的谷歌AI,会在自我限制中越走越慢吗?

来源&#xff1a;wired为了防止技术被滥用&#xff0c;谷歌对新推出的人脸识别服务进行了限制&#xff0c;但这种限制有时候反而会让竞争对手抢得市场先机。谷歌之所以成为今天的谷歌&#xff0c;是因为它不断创造先进的新技术&#xff0c;并将这些技术向所有人开放。大型企业和…

用jsp实现右导航窗格_手机导航如何投放到汽车中控屏?建议用这2种办法,轻松实现同屏...

对于我们许多的司机来说&#xff0c;虽然车上有车载导航&#xff0c;但是出于个人习惯&#xff0c;我们很多人还是习惯用手机导航&#xff0c;由于手机导航它的定位较为精准&#xff0c;而且使用起来比较方便&#xff0c;所以说更受司机朋友的青睐&#xff0c;但是有一个毛病就…

MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)

属性页对话框包括向导对话框和一般属性页对话框两类&#xff0c;上一节讲了如何创建并显示向导对话框&#xff0c;本节将继续介绍一般属性页对话框的创建和显示。 实际上&#xff0c;一般属性页对话框的创建和显示过程和向导对话框是很类似的。将上一节中的向导对话框进行少量修…

javascript 等待指定时间_javascript的单线程和任务队列

一、JavaScript为什么设计为单线程&#xff1f;JavaScript语言的一大特点就是单线程&#xff0c;换言之就是同一个时间只能做一件事。其他任务都必须在后面排队等待。for(var i 0; i < 5; i) {console.log(i); } console.log(end);上面的代码&#xff0c;只有for循环执行完…

2019年云计算行业深度报告

来源&#xff1a;西部证券 导语 根据 Gartner 数据 2018 年全球公有云市场规模达到 1392 亿美元&#xff0c;2015 年至 2018 年复合增长 28.24%&#xff0c;预计 2021 年规模将达到 2461 亿美元。 一、云计算蓬勃发展&#xff0c;驱动数据中心基础设施采购 1.1 云计算蓬勃发展&…

dataframe 一列的不同值_pandas | 详解DataFrame中的apply与applymap方法

点击上方蓝字&#xff0c;关注并星标&#xff0c;和我一起学技术。今天是pandas数据处理专题的第5篇文章&#xff0c;我们来聊聊pandas的一些高级运算。在上一篇文章当中&#xff0c;我们介绍了panads的一些计算方法&#xff0c;比如两个dataframe的四则运算&#xff0c;以及da…

JS电子文档链接

http://www.oschina.net/translate/learning-javascript-design-patterns 学用 JavaScript 设计模式 http://es6.ruanyifeng.com/                       ECMAScript 6 入门 https://github.com/justjavac/12-javascript-quirks …

https访问http加载不出图片_前端解决第三方图片防盗链的办法

作者&#xff1a;biaochenxuying转发链接&#xff1a;https://github.com/biaochenxuying/blog/issues/31问题笔者网站的图片都是上传到第三方网站上的&#xff0c;比如 简书、掘金、七牛云上的&#xff0c;但是最近简书和掘金都开启了 防盗链&#xff0c;防止其他网站访问他们…

java spring boot 注解验证_如何理解Java原生注解和Spring 各种注解?

作者&#xff1a;digdeep.cnblogs.com/digdeep/p/4525567.html导引Spring中的注解大概可以分为两大类&#xff1a;spring的bean容器相关的注解&#xff0c;或者说bean工厂相关的注解&#xff1b;springmvc相关的注解。spring的bean容器相关的注解有&#xff1a;Required&#x…

数据驱动的未来城市八大趋势

来源&#xff1a;微信公众号腾讯研究院 趋势一 更可持续 城市的发展要为整个人类文明的永续传承和为后人能享受到更高质量的生活为目标。一个更加智慧的城市&#xff0c;势必具有着更加可持续发展的能力。新科技为城市的核心系统的设施提供了更为智能、高效率的调配方案&#x…

浪潮服务器bios怎么找回密码,服务器BIOS密码丢失解决方法

先升级iBMC&#xff0c;再升级bios&#xff0c;可以将bios密码重置。此案例以RH2288为例&#xff1a;1、登录到iBMC web界面&#xff0c;点击系统设置里的固件升级&#xff0c;将BMC升级包image.hpm上传后&#xff0c;点击升级&#xff0c;因为BMC主备两个镜像&#xff0c;需要…

现在早上起来都还是感觉颈椎有些通

不会得了颈椎病吧 转载于:https://www.cnblogs.com/bkchengzheng/p/6228103.html

惠普打印机136w硒鼓芯片怎么清零_关于惠普彩激升级后无法识别硒鼓的处理方案...

近日来收到不少用户反馈自己的惠普彩色激光机升级固件后无法识别硒鼓了&#xff0c;但是以前都能识别&#xff0c;硒鼓是兼容的。这是因为惠普的最新发布的固件版本20201021增加了验证机制&#xff0c;识别到硒鼓是非原装的时候直接锁机&#xff0c;拒绝使用&#xff0c;这也是…

看了中国与别国的科研差距后,究竟什么才是真正的科研精神?

来源&#xff1a;募格学术 目前&#xff0c;中国的科研环境越来越好&#xff0c;单就硬件上来讲&#xff0c;与欧美发达国家没有很大差别。2014年&#xff0c;中国研发投入13400亿元&#xff0c;占GPD2.1%&#xff0c;这个比例超过了欧盟。然而&#xff0c;引人深思的是中国缺席…

删除计算机文件的几种方法,电脑删除不了文件怎么办?教你几种好的处理方法,一学就会...

现在是电脑的时代&#xff0c;我们每天都要在计算机上处理大量的文件。但是有的时候&#xff0c;电脑上会出现删不了文件的情况。出现这种情况可能是下面的几种原因。1.首先检查与文件相关的软件是否正常运行&#xff0c;并且尝试关闭它。如果你正在编辑或查看office文档&#…

numpy 转置_Numpy基础:数组转置和轴对换

转置&#xff08;transpose&#xff09;是重塑的一种特殊形式&#xff0c;它返回的是源数据的视图&#xff08;不会进行任何复制操作&#xff09;。数组不仅有transpose方法&#xff0c;还有一个特殊的T属性。In[70]:arrnp.arange(15).reshape((3,5))In[71]:arrOut[71]: array(…

Jmeter学习

网址&#xff1a; http://www.ltesting.net/ceshi/open/kyxncsgj/jmeter/ http://www.cnblogs.com/TankXiao/p/4059378.html?utm_sourcetuicool http://blog.csdn.net/chenleixing/article/details/43418185/ http://www.blogjava.net/lijun_li/archive/2014/06/26/296453.htm…