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下阻止表单重复提交、防刷新、防后退
Aug 17 Javascript
Jquery 表单验证类介绍与实例
Jun 09 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
Dec 04 Javascript
jQuery队列操作方法实例
Jun 11 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
Aug 10 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
Aug 19 Javascript
深入学习jQuery中的data()
Dec 22 Javascript
JS前端加密算法示例
Dec 22 Javascript
JavaScript定义全局对象的方法示例
Jan 12 Javascript
js实现图片上传预览原理分析
Jul 13 Javascript
node.js实现的装饰者模式示例
Sep 06 Javascript
vue中组件的过渡动画及实现代码
Nov 21 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 获取可变函数参数的函数
2009/08/26 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
php扩展开发入门demo示例
2019/09/23 PHP
jquery ajax post提交数据乱码
2013/11/05 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
2014/02/07 Javascript
jQuery实现数字加减效果汇总
2014/12/16 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
JavaScript中的冒泡排序法
2016/08/03 Javascript
浅谈MVC+EF easyui dataGrid 动态加载分页表格
2016/11/10 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
JS按钮闪烁功能的实现代码
2017/07/21 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
python魔法方法-自定义序列详解
2016/07/21 Python
Python中矩阵创建和矩阵运算方法
2018/08/04 Python
Python随机生成身份证号码及校验功能
2018/12/04 Python
Python中extend和append的区别讲解
2019/01/24 Python
Python去除字符串前后空格的几种方法
2019/03/04 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
pytorch:实现简单的GAN示例(MNIST数据集)
2020/01/10 Python
django使用graphql的实例
2020/09/02 Python
Python基于内置函数type创建新类型
2020/10/22 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
python tkinter实现连连看游戏
2020/11/16 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
资源工程专业毕业生求职信
2014/02/27 职场文书
安全环保标语
2014/06/09 职场文书