javascript性能优化之事件委托实例详解


Posted in Javascript onDecember 12, 2015

本文实例分析了javascript性能优化之事件委托。分享给大家供大家参考,具体如下:

为下面每个LI绑定一个click事件

<ul id="myLinks">
  <li id="goSomewhere" >Go somewhere</li>
  <li id="doSomething" >Do something</li>
  <li id="sayHi" >Say hi</li>
</ul>

一、传统写法

var item1=document.getElementById("goSomewhere");
var item2=document.getElementById("doSomething");
var item3=document.getElementById("sayHi");
item1.onclick = function(){
  console.log('goSomewhere');
}
item2.onclick = function(){
  console.log('doSomething');
}
item3.onclick = function(){
  alert("hello");
}

在javascript中,添加到页面上的事件处理程序数量将直接关系到页面的整体运行性能,事件越多,性能越差。

导致原因是多方面:

1、每个函数都是对象,都会占用内存;内存中的对象越多,性能就越差。
2、必须事先指定所有事件处理程序而导致的DOM访问次数,会延迟整个页面的交互就绪时间。

二、事件委托

对“事件处理程序过多”问题的解决方案就是事件委托。

事件委托利用了事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。例如:click事件会一直冒泡到document层次。也就是说,我们可以为整个页面指定一个onclick事件处理程序,而不必给每个可单击的元素分别添加事件处理程序。

事件委托方法:

var list=document.getElementById("myLinks");
list.onclick = function(e){
  var target = e.target;  
  switch(target.id){
   case "goSomewhere":
    console.log('goSomewhere');
    break; 
   case "doSomething":
    console.log('doSomething');
    break; 
   case "sayHi":
    alert("hello");
    break; 
  }
}

三、使用事件委托的优点:

1)document对象很快就可以访问,而且可以在页面生命周期的任何时间点上为它添加事件处理程序(无需等待DOMContentLoaded或load事件)。换句话说,只要可单击的元素呈现在页面上,就可以立即具备适当的功能。

2)在页面中设置事件处理程序所需的时间更少。只添加一个事件处理程序所需的Dom引用更少,所花的时间也更少。

3)整个页面占用的内存空间更少,能够提升整体性能。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
Aug 19 Javascript
才发现的超链接js导致网页中GIF动画停止的解决方法
Nov 02 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
Dec 29 Javascript
JS原型对象通俗&quot;唱法&quot;
Dec 27 Javascript
简单常用的幻灯片播放实现代码
Sep 25 Javascript
jquery xMarquee实现文字水平无缝滚动效果
Apr 29 Javascript
基于jquery实现无限级树形菜单
Mar 22 Javascript
jQuery UI仿淘宝搜索下拉列表功能
Jan 10 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
Sep 15 Javascript
js限制输入框只能输入数字(onkeyup触发)
Sep 28 Javascript
微信小程序实现简单评论功能
Nov 28 Javascript
JS JQuery获取data-*属性值方法解析
Sep 01 jQuery
jsonp跨域请求数据实现手机号码查询实例分析
Dec 12 #Javascript
jQuery Validate初步体验(二)
Dec 12 #Javascript
jQuery Validate初步体验(一)
Dec 12 #Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
Dec 12 #Javascript
jQuery同步提交示例代码
Dec 12 #Javascript
JavaScript匿名函数之模仿块级作用域
Dec 12 #Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
Dec 12 #Javascript
You might like
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
2013/06/19 PHP
跟我学Laravel之视图 &amp; Response
2014/10/15 PHP
PHP实现数组和对象的相互转换操作示例
2019/03/20 PHP
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
2016/02/12 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
Javascript实现购物车功能的详细代码
2018/05/08 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python编写生成验证码的脚本的教程
2015/05/04 Python
浅谈python为什么不需要三目运算符和switch
2016/06/17 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
Python 最大概率法进行汉语切分的方法
2018/12/14 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
10行Python代码计算汽车数量的实现方法
2019/10/23 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
DJI美国:消费类无人机领域的领导者
2018/04/27 全球购物
英国景点门票网站:attractiontix
2019/08/27 全球购物
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
采购主管工作职责
2013/12/12 职场文书
经营理念标语
2014/06/21 职场文书
初中毕业典礼演讲稿
2014/09/09 职场文书
教师党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
经验交流材料格式
2014/12/30 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
python 闭包函数详细介绍
2022/04/19 Python