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 03 Javascript
js获取微信版本号的方法
May 12 Javascript
javascript学习笔记之函数定义
Jun 25 Javascript
jQuery插件学习教程之SlidesJs轮播+Validation验证
Jul 12 Javascript
浅谈js中StringBuffer类的实现方法及使用
Sep 02 Javascript
彻底学会Angular.js中的transclusion
Mar 12 Javascript
使用vue.js编写蓝色拼图小游戏
Mar 17 Javascript
详解AngularJS ui-sref的简单使用
Apr 24 Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
Feb 28 Javascript
JavaScript设计模式之工厂模式简单实例教程
Jul 03 Javascript
vue中音频wavesurfer.js的使用方法
Feb 20 Vue.js
JavaScript事件循环及宏任务微任务原理解析
Sep 02 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函数与传递参数实例分析
2014/11/15 PHP
PHP内存使用情况如何获取
2015/10/10 PHP
php读取txt文件并将数据插入到数据库
2016/02/23 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
thinkphp5使用无限极分类
2019/02/18 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
JS快速实现移动端拼图游戏
2016/09/05 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
2016/12/28 Javascript
bootstrap提示标签、提示框实现代码
2016/12/28 Javascript
NodeJS测试框架mocha入门教程
2017/03/28 NodeJs
javaScript 逻辑运算符使用技巧整理
2017/05/03 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
js回文数的4种判断方法示例
2019/06/04 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
uni app仿微信顶部导航条功能
2019/09/17 Javascript
Vue2.0 实现页面缓存和不缓存的方式
2019/11/12 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
Python ATM功能实现代码实例
2020/03/19 Python
tensorflow常用函数API介绍
2020/04/19 Python
css3新单位vw、vh的使用教程
2018/03/23 HTML / CSS
Topshop法国官网:英国快速时尚品牌
2018/04/08 全球购物
化学教师教学反思
2014/01/17 职场文书
行政部岗位职责范本
2014/03/13 职场文书
《三顾茅庐》教学反思
2014/04/10 职场文书
工程造价专业求职信
2014/07/17 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
公务员年终个人总结
2015/02/12 职场文书
大学新生入学感想
2015/08/07 职场文书
全民创业工作总结
2015/08/13 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书
使用nginx配置访问wgcloud的方法
2021/06/26 Servers
mysql幻读详解实例以及解决办法
2022/06/16 MySQL