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 相关文章推荐
从新浪弄下来的全屏广告代码 与使用说明
Mar 15 Javascript
JavaScript 捕获窗口关闭事件
Jul 26 Javascript
JavaScript使用slice函数获取数组部分元素的方法
Apr 06 Javascript
jQuery的remove()方法使用详解
Aug 11 Javascript
vue多级多选菜单组件开发
Sep 08 Javascript
js实现数组去重方法及效率?Ρ? target=
Feb 14 Javascript
Bootstrap模态框案例解析
Mar 05 Javascript
Vue实现自带的过滤器实例
Mar 09 Javascript
解决vue 给window添加和移除resize事件遇到的坑
Jul 21 Javascript
基于vue hash模式微信分享#号的解决
Sep 07 Javascript
小程序实现上下切换位置
Nov 16 Javascript
Vue全家桶入门基础教程
May 14 Vue.js
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
WHOIS类的修改版
2006/10/09 PHP
UCenter Home二次开发指南
2009/05/28 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
PHP微框架Dispatch简介
2014/06/12 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
PHP调用Mailgun发送邮件的方法
2017/05/04 PHP
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
JS实现OCX控件的事件响应示例
2014/09/17 Javascript
jQuery图片渐变特效的简单实现
2016/06/25 Javascript
TypeScript入门-接口
2017/03/30 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
2017/07/20 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
vue项目中使用vue-i18n报错的解决方法
2019/01/13 Javascript
vue.js 2.0实现简单分页效果
2019/07/29 Javascript
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
2019/06/28 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
2019/07/11 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
PyTorch加载预训练模型实例(pretrained)
2020/01/17 Python
django实现日志按日期分割
2020/05/21 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
俄罗斯卫浴采暖及维修用品超级市场:Dkrussia
2020/05/12 全球购物
专营店会计助理岗位职责
2013/11/29 职场文书
书法培训心得体会
2014/01/05 职场文书
交通安全寄语大全
2014/04/08 职场文书
美丽心灵观后感
2015/06/01 职场文书
Python基础知识之变量的详解
2021/04/14 Python
react合成事件与原生事件的相关理解
2021/05/13 Javascript
MySQL 数据表操作
2022/05/04 MySQL