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工具函数代码
Feb 17 Javascript
输入密码检测大写是否锁定js实现代码
Dec 03 Javascript
修改js confirm alert 提示框文字的简单实例
Jun 10 Javascript
灵活使用数组制作图片切换js实现
Jul 28 Javascript
React进阶学习之组件的解耦之道
Aug 07 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
May 31 jQuery
vue移动端轻量级的轮播组件实现代码
Jul 12 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
Jul 21 Javascript
微信小程序实现消息框弹出动画
Apr 18 Javascript
vue实现购物车选择功能
Jan 10 Javascript
js Proxy的原理详解
May 25 Javascript
字节飞书面试promise.all实现示例
Jun 16 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
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
Session服务器配置指南与使用经验的深入解析
2013/06/17 PHP
php解析mht文件转换成html的实例
2017/03/13 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
PHP中cookie知识点学习
2018/05/06 PHP
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
Javascript中数组方法汇总(推荐)
2015/04/01 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
深入学习jQuery中的data()
2016/12/22 Javascript
JavaScript函数表达式详解及实例
2017/05/05 Javascript
JavaScript输入框字数实时统计更新
2017/06/17 Javascript
vuex(vue状态管理)的特殊应用案例分享
2020/03/03 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
使用Python对Csv文件操作实例代码
2017/05/12 Python
Python实现简单的HttpServer服务器示例
2017/09/25 Python
matplotlib 纵坐标轴显示数据值的实例
2018/05/25 Python
对python中的高效迭代器函数详解
2018/10/18 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
sklearn-SVC实现与类参数详解
2019/12/10 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
python 实现弹球游戏的示例代码
2020/11/17 Python
用Python实现职工信息管理系统
2020/12/30 Python
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
高清屏下canvas重置尺寸引发的问题的解决
2019/10/14 HTML / CSS
Amara美国站:英国高端家居礼品网站,世界各地的奢侈家具品牌
2017/07/26 全球购物
应届生财务会计求职信
2013/11/05 职场文书
技校个人求职信范文
2014/01/25 职场文书
给学校的建议书范文
2014/05/15 职场文书
2014年学校工作总结
2014/11/20 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
战友聚会致辞
2015/07/28 职场文书
2016中秋节问候语
2015/11/11 职场文书