JavaScript Tips 使用DocumentFragment加快DOM渲染速度


Posted in Javascript onJune 28, 2010

大家在使用JavaScript的时候,DOM操作是最平常不过的了, 随着Web前端技术的发展,我们越来越多的使用JS来操作DOM元素,比如通过ajax请求获取到数据,然后更新页面上的元素,一般情况下,这种操作我们会用类似node.appendChild()这中方式来完成。这个方法是无缓冲的,也就是说我们每次调用appendChild方法的时候,浏览器都会重新渲染页面。当然,使用这种方法也没有什么不行,因为我们在一般情况下都是对少量的DOM节点进行更新,也并不会带来太大的性能问题,但是如果大量的更新DOM节点,那么性能的差距就会越来越明显了。因为浏览器要不停的渲染页面,尤其是一些复杂的标签,大量的重新渲染非常消耗性能,影响用户体验。那么有什么好的方法能让这类DOM操作的效率提高呢?

虽然我们平时在开发中遇到这样情况的时候并不多,但还是有必要了解一下,JS中提供了一个DocumentFragment的机制,相信大家对这个并不陌生,它可以提供一个缓冲的机制,将DOM节点先放到内存中,当节点都构造完成后,再将DocumentFragment对象添加到页面中,这时所有的节点都会一次渲染出来,这样就能减少浏览器很多的负担,明显的提高页面渲染速度。例如下面的代码:

function CreateNodes(){ 
for(var i = 0;i < 10000;i++){ 
var tmpNode = document.createElement("div"); 
tmpNode.innerHTML = "test" + i + " <br />"; 
document.body.appendChild(tmpNode); 
} 
} 
function CreateFragments(){ 
var fragment = document.createDocumentFragment(); 
for(var i = 0;i < 10000;i++){ 
var tmpNode = document.createElement("div"); 
tmpNode.innerHTML = "test" + i + "<br />"; 
fragment.appendChild(tmpNode); 
} 
document.body.appendChild(fragment); 
}

上面的代码给出了两个函数,分别是用普通的DOM方法和DocumentFragement两种方式向页面添加一万个div节点,大家可以自己实验一下,使用第二种方式要比第一种快很多。这里只是简单的div标签的平铺添加,如果是更加复杂的HTML标签或是多层的嵌套标签,那么性能的差距就会更加明显。

通过上面的例子,大家在开发JavaScript应用的时候,如果遇到这种大量节点的情况,不妨将DocumentFragment作为一个备选的方案。

Javascript 相关文章推荐
javascript 在网页中的运用(asp.net)
Nov 23 Javascript
JS模拟面向对象全解(二、类型与赋值)
Jul 13 Javascript
JQuery里面的几种选择器 查找满足条件的元素$(&quot;#控件ID&quot;)
Aug 23 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
Dec 07 Javascript
使用Js让Html中特殊字符不被转义
Nov 05 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
Jun 14 Javascript
jquery插件canvaspercent.js实现百分比圆饼效果
Jul 18 jQuery
利用JS实现一个同Excel表现的智能填充算法
Aug 13 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
Sep 27 Javascript
实例讲解JavaScript预编译流程
Jan 24 Javascript
详解JS取出两个数组中的不同或相同元素
Mar 20 Javascript
Vue开发中遇到的跨域问题及解决方法
Feb 11 Javascript
js getElementsByTagName的简写方式
Jun 27 #Javascript
两种简单实现菜单高亮显示的JS类代码
Jun 27 #Javascript
用apply让javascript函数仅执行一次的代码
Jun 27 #Javascript
验证javascript中Object和Function的关系的三段简单代码
Jun 27 #Javascript
jQuery选择头像并实时显示的代码
Jun 27 #Javascript
Javascript匿名函数的一种应用 代码封装
Jun 27 #Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
Jun 25 #Javascript
You might like
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
2011/06/10 PHP
PHP获取网址的顶级域名函数代码
2012/09/24 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
2011/11/30 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
javascript操作css属性
2013/12/30 Javascript
理解javascript封装
2016/02/23 Javascript
div实现自适应高度的textarea实现angular双向绑定
2017/01/08 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
微信小程序封装http访问网络库实例代码
2017/05/24 Javascript
vue实现计步器功能
2019/11/01 Javascript
Vue初始化中的选项合并之initInternalComponent详解
2020/06/11 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
Python实现身份证号码解析
2015/09/01 Python
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
六行python代码的爱心曲线详解
2019/05/17 Python
pandas计数 value_counts()的使用
2019/06/24 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
python实现日志按天分割
2019/07/22 Python
django中的图片验证码功能
2019/09/18 Python
Python+OpenCV实现实时眼动追踪的示例代码
2019/11/11 Python
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
上海方立数码笔试题
2013/10/18 面试题
自荐书格式
2013/12/01 职场文书
圣诞节红领巾广播稿
2014/02/03 职场文书
员工评语范文
2014/12/31 职场文书
2015年护士工作总结范文
2015/03/31 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python