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的面向对象(二)
Nov 09 Javascript
innerhtml用法 innertext用法 以及innerHTML与innertext的区别
Oct 26 Javascript
一个可以兼容IE FF的加为首页与加入收藏实现代码
Nov 02 Javascript
Javascript 中的类和闭包
Jan 08 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
Dec 06 Javascript
javaScript对文字按照拼音排序实现代码
Dec 27 Javascript
JS检测输入字符是否包含非法字符的示例代码
Feb 11 Javascript
jQuery增加自定义函数的方法
Jul 18 Javascript
JS组件Bootstrap Select2使用方法详解
Apr 17 Javascript
详解Javascript数据类型的转换规则
Dec 12 Javascript
详解Vue内部怎样处理props选项的多种写法
Nov 06 Javascript
vue和better-scroll实现列表左右联动效果详解
Apr 29 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+JS无限级可伸缩菜单详解(简单易懂)
2007/01/02 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
JS版网站风格切换实例代码
2008/10/06 Javascript
用Javascript 和 CSS 实现脚注(Footnote)效果
2009/09/09 Javascript
Javascript 定时器调用传递参数的方法
2009/11/12 Javascript
Javascript中的this绑定介绍
2011/09/22 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
node.js中的fs.unlinkSync方法使用说明
2014/12/15 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
iframe跨域通信封装详解
2015/08/11 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
2015/11/24 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
分享JavaScript监听全部Ajax请求事件的方法
2016/08/28 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
Vue2.0权限树组件实现代码
2017/08/29 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
[08:02]DOTA2牵红线 zhou神抱得美人归
2014/03/22 DOTA
python交互式图形编程实例(三)
2017/11/17 Python
Python内建模块struct实例详解
2018/02/02 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
python解析yaml文件过程详解
2019/08/30 Python
从训练好的tensorflow模型中打印训练变量实例
2020/01/20 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
护士实习求职信
2014/06/22 职场文书
超搞笑婚前保证书
2015/05/08 职场文书
范文之农村基层党建工作报告
2019/10/24 职场文书
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js