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 相关文章推荐
ie 调试javascript的工具
Apr 29 Javascript
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
Oct 24 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
Jul 31 Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
Sep 21 Javascript
JS如何判断移动端访问设备并解析对应CSS
Nov 27 Javascript
图片翻转效果具体实现代码
Jan 09 Javascript
深入理解js函数的作用域与this指向
May 28 Javascript
JavaScript中的ajax功能的概念和示例详解
Oct 17 Javascript
jQuery实现立体式数字动态增加(animate方法)
Dec 21 Javascript
canvas时钟效果
Feb 16 Javascript
微信小程序实现图片上传放大预览删除代码
Jun 28 Javascript
浅析vue 函数配置项watch及函数 $watch 源码分享
Nov 22 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
php中explode的负数limit用法分析
2015/02/27 PHP
php中foreach结合curl实现多线程的方法分析
2016/09/22 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
JS编程小常识很有用
2012/11/26 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
Javascript的表单验证长度
2016/03/16 Javascript
js实现可控制左右方向的无缝滚动效果
2016/05/29 Javascript
全面解析Angular中$Apply()及$Digest()的区别
2016/08/04 Javascript
JavaScript实现in-place思想的快速排序方法
2016/08/07 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
浅谈$_FILES数组为空的原因
2017/02/16 Javascript
bootstrap的工具提示实例代码
2017/05/17 Javascript
详解基于webpack2.x的vue2.x的多页面站点
2017/08/21 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
javascript回调函数详解
2018/02/06 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
2019/11/11 jQuery
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
[52:03]Secret vs VG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python获取从命令行输入数字的方法
2015/04/29 Python
python实现定时自动备份文件到其他主机的实例代码
2018/02/23 Python
python中调试或排错的五种方法示例
2019/09/12 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
python pyecharts 实现一个文件绘制多张图
2020/05/13 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
2021/01/08 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
批评与自我批评材料
2014/02/15 职场文书
婚前协议书怎么写
2014/04/15 职场文书
另类冲刺标语
2014/06/24 职场文书
班主任自我评价范文
2015/03/11 职场文书
歌舞青春观后感
2015/06/10 职场文书
高中政治教学反思
2016/02/23 职场文书
Python中22个万用公式的小结
2021/07/21 Python
Redis基本数据类型List常用操作命令
2022/06/01 Redis