javascript性能优化之DOM交互操作实例分析


Posted in Javascript onDecember 12, 2015

本文实例讲述了javascript性能优化之DOM交互操作技巧。分享给大家供大家参考,具体如下:

在javascript各个方面,DOM毫无疑问是最慢的一部分。DOM操作与交互要耗费大量时间,因为它们往往需要重新渲染整个页面或者某一部分。理解如何优化与DOM的交互可以极大提高脚本完成的速度。

1、最小化DOM更新

看下面例子:

var list = document.getElementById("ul");
for (var i=0; i < 10; i++){
  var item = document.createELement("li");
  item.appendChild(document.createTextNode("item" + i));
  list.appendChild(item);
}
//这段代码为列表添加10个项目。添加每个项目时,都有两次DOM更新。总共需要20次DOM更新。

我们可以使用 文档碎片 来最小化DOM更新。

var list = document.getElementById("ul");
var fragment = document.createDocumentFragment();
for (var i=0; i < 10; i++){
  var item = document.createELement("li");
  item.appendChild(document.createTextNode("item" + i));
  fragment.appendChild(item);
}
list.appendChild(fragment);

更多关于 文档碎片,详见之前文章 《JavaScript文档碎片操作实例分析》

2、使用innerHTML

对于比较大的DOM更改,使用innerHTML要比createElement()和appendChild()快。

var list = document.getElementById("ul");
var html = "";
for (var i=0; i < 10; i++){
  html += "<li>item" + i + "<li>";
}
list.innerHTML = html;

3、使用事件委托

详见之前文章 《javascript性能优化之事件委托实例详解》

4、注意NodeList

最小化访问NodeList的次数可以极大的改进脚本的性能,因为每次访问NodeList,都会运行一次基于文档的查询。

var imgs = document.getElementsByTagName("img");
for (var i=0, len=imgs.length; i < len; i++){
  var image = imgs[i];
  //more code
}
//这里的关键是长度length存入了len变量,而不是每次都去访问NodeList的length属性。当在循环中使用NodeList的时候,把imgs[i]放入image变量中,以避免在循环体内多次调用NodeList;

更多关于 NodeList,详见之前文章 《在javascript将NodeList作为Array数组处理的方法》

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

Javascript 相关文章推荐
读jQuery之九 一些瑕疵说明
Jun 21 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
Mar 03 Javascript
jQuery控制Div拖拽效果完整实例分析
Apr 15 Javascript
分析js闭包引起的事件注册问题
Mar 29 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
Nov 18 Javascript
prototype与__proto__区别详细介绍
Jan 09 Javascript
Ajax实现不刷新取最新商品
Mar 01 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
Apr 01 Javascript
JavaScript中offsetWidth的bug及解决方法
May 17 Javascript
vue中实现在外部调用methods的方法(推荐)
Feb 08 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
Sep 27 Javascript
vue路由切换时取消之前的所有请求操作
Sep 01 Javascript
JavaScript文档碎片操作实例分析
Dec 12 #Javascript
javascript性能优化之事件委托实例详解
Dec 12 #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
You might like
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
PHP随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
PHP开发框架Laravel数据库操作方法总结
2014/09/03 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
PHP学习记录之数组函数
2018/06/01 PHP
Javascript实例教程(19) 使用HoTMetal(5)
2006/12/23 Javascript
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
JavaScript中的类数组对象介绍
2014/12/30 Javascript
javascript实现鼠标拖动改变层大小的方法
2015/04/30 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
vue+webpack实现异步组件加载的方法
2018/02/03 Javascript
JavaScript捕捉事件和阻止冒泡事件实例分析
2018/08/03 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
vue2 中二级路由高亮问题及配置方法
2019/06/10 Javascript
JavaScript this使用方法图解
2020/02/04 Javascript
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
python迭代器与生成器详解
2016/03/10 Python
ubuntu系统下 python链接mysql数据库的方法
2017/01/09 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
2020/02/26 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
2020/06/11 Python
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
Reebonz中国官网:新加坡奢侈品购物网站
2017/03/17 全球购物
前台文员的岗位职责
2013/11/14 职场文书
教师专业自荐书范文
2014/02/10 职场文书
初一新生军训方案
2014/05/22 职场文书
2014大学生批评与自我批评思想汇报
2014/09/21 职场文书
绵山导游词
2015/02/05 职场文书
2016年国培心得体会及反思
2016/01/13 职场文书
导游词之秦皇岛燕塞湖
2020/01/03 职场文书
关于Numpy之repeat、tile的用法总结
2021/06/02 Python