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 相关文章推荐
jquery1.4 教程二 ajax方法的改进
Feb 25 Javascript
文字不间断滚动(上下左右)实例代码
Apr 21 Javascript
table对象中的insertRow与deleteRow使用示例
Jan 26 Javascript
Markdown+Bootstrap图片自适应属性详解
May 21 Javascript
javascript运算符语法全面概述
Jul 14 Javascript
jquery自定义表单验证插件
Oct 12 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
Oct 28 Javascript
浅析Jquery操作select
Dec 13 Javascript
详解Angular2 关于*ngFor 嵌套循环
May 22 Javascript
微信小程序自定义tabBar组件开发详解
Sep 24 Javascript
基于JavaScript判断两个对象内容是否相等
Jan 10 Javascript
纯JS实现五子棋游戏
May 28 Javascript
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
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
PHP中session跨子域的三种实现方法
2016/07/25 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
Google韩国首页图标动画效果
2007/08/26 Javascript
js option删除代码集合
2008/11/12 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
2011/09/28 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
jQuery实现的简单对话框拖动功能示例
2018/06/05 jQuery
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
[01:01:22]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Python 正则表达式(转义问题)
2014/12/15 Python
Python对多属性的重复数据去重实例
2018/04/18 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
html5 利用canvas实现超级玛丽简单动画
2013/09/06 HTML / CSS
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
英国在线发型和美容产品商店:Beauty Cutie
2019/04/27 全球购物
会计专业推荐信
2013/10/29 职场文书
高中生毕业学习总结的自我评价
2013/11/14 职场文书
人力资源管理专业自荐书范文
2014/02/10 职场文书
党员岗位承诺书
2014/03/25 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书