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 相关文章推荐
初探jquery——表单应用范例
Feb 20 Javascript
js活用事件触发对象动作
Aug 10 Javascript
JavaScript面向对象之Prototypes和继承
Jul 12 Javascript
js简单实现HTML标签Select联动带跳转
Oct 23 Javascript
基于jquery和svg实现超炫酷的动画特效
Dec 09 Javascript
javascript带回调函数的异步脚本载入方法实例分析
Jul 02 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
May 21 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
Jan 13 Javascript
react-native-fs实现文件下载、文本存储的示例代码
Sep 22 Javascript
javaScript和jQuery自动加载简单代码实现方法
Nov 24 jQuery
vue插件draggable实现拖拽移动图片顺序
Dec 01 Javascript
react koa rematch 如何打造一套服务端渲染架子
Jun 26 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操作XML作为数据库的类
2010/12/19 PHP
php删除左端与右端空格的方法
2014/11/29 PHP
Yii框架登录流程分析
2014/12/03 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
List the Codec Files on a Computer
2007/06/11 Javascript
3款实用的在线JS代码工具(国外)
2012/03/15 Javascript
js复制网页内容并兼容各主流浏览器的代码
2013/12/17 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
2017/05/01 jQuery
vue2.0 与 bootstrap datetimepicker的结合使用实例
2017/05/22 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
Pandas之drop_duplicates:去除重复项方法
2018/04/18 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
Python urllib.request对象案例解析
2020/05/11 Python
使用Python将语音转换为文本的方法
2020/08/10 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
2020/10/28 Python
html5利用canvas绘画二级树形结构图的示例
2017/09/27 HTML / CSS
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
Cotton On香港网站:澳洲时装连锁品牌
2018/11/01 全球购物
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
大学生万能检讨书范例
2014/10/04 职场文书
2014年大学班级工作总结
2014/11/14 职场文书
公安纪律作风整顿心得体会
2016/01/23 职场文书
MySQL数据库压缩版本安装与配置详细教程
2021/05/21 MySQL
Python re.sub 反向引用的实现
2021/07/07 Python
详解TypeScript的基础类型
2022/02/18 Javascript
python数字类型和占位符详情
2022/03/13 Python