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 常用关键字列表集合
Dec 04 Javascript
jQuery生成asp.net服务器控件的代码
Feb 04 Javascript
js加减乘除丢失精度问题解决方法
May 16 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
Apr 26 Javascript
HTML5 实现的一个俄罗斯方块实例代码
Sep 19 Javascript
ES6中的rest参数与扩展运算符详解
Jul 18 Javascript
基于JavaScript实现弹幕特效
Aug 27 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
Feb 05 Javascript
搭建vue开发环境
Jul 19 Javascript
JavaScript实现的前端AES加密解密功能【基于CryptoJS】
Aug 28 Javascript
node之本地服务器图片上传的方法示例
Mar 26 Javascript
Vue实现Header渐隐渐现效果的实例代码
Nov 05 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/10/20 PHP
PHP Cookie的使用教程详解
2013/06/03 PHP
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
ThinkPHP进程计数类Process用法实例详解
2015/09/25 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
PHP8.0新功能之Match表达式的使用
2020/07/19 PHP
JavaScript的parseInt 取整使用
2011/05/09 Javascript
网页中返回顶部代码(多种方法)另附注释说明
2013/04/24 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
JS定时器实例详细分析
2013/10/11 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
2016/07/05 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
利用Javascript实现一套自定义事件机制
2017/12/14 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
2019/10/11 Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
2019/12/31 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
Vue项目打包部署到apache服务器的方法步骤
2021/02/01 Vue.js
python三引号输出方法
2019/02/27 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
Miller Harris官网:英国小众香水品牌
2020/09/24 全球购物
经济与贸易专业应届生求职信
2013/11/19 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
优秀党支部书记事迹材料
2014/05/29 职场文书
代理人委托书
2014/08/01 职场文书
2014年银行工作总结范文
2014/11/12 职场文书
大学生自荐信范文
2015/03/05 职场文书
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python
python 闭包函数详细介绍
2022/04/19 Python