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 相关文章推荐
js刷新框架子页面的七种方法代码
Nov 20 Javascript
Array的push与unshift方法性能比较分析
Mar 05 Javascript
JQuery实现倒计时按钮的实现代码
Mar 23 Javascript
THREE.JS入门教程(3)着色器-下
Jan 24 Javascript
javascript两种function的定义介绍及区别说明
May 02 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
Feb 19 Javascript
jquery trigger实现联动的方法
Feb 29 Javascript
jquery自定义插件开发之window的实现过程
May 06 Javascript
Javascript中作用域的详细介绍
Oct 06 Javascript
vue mint-ui学习笔记之picker的使用
Oct 11 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
Apr 04 Javascript
如何用JavaScript学习算法复杂度
Apr 30 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
全国FM电台频率大全 - 15 山东省
2020/03/11 无线电
php中动态变量用法实例
2015/06/10 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
2016/06/12 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
2014/05/08 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
js拖拽的原型声明和用法总结
2016/04/04 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
微信小程序实现分页加载效果
2020/11/19 Javascript
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
Django csrf 验证问题的实现
2018/10/09 Python
python实现二分类的卡方分箱示例
2019/11/22 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
元旦晚会主持词
2014/03/24 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
优秀员工自荐书
2015/03/06 职场文书