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控制iframe滚动的代码
Apr 10 Javascript
jquery isType() 类型判断代码
Feb 14 Javascript
浅析js中取绝对值的2种方法
Jul 09 Javascript
JS中实现replaceAll的方法(实例代码)
Nov 12 Javascript
js防止DIV布局滚动时闪动的解决方法
Oct 30 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
Dec 14 Javascript
利用VUE框架,实现列表分页功能示例代码
Jan 12 Javascript
使用cookie绕过验证码登录的实现代码
Oct 12 Javascript
vue-cli3脚手架的配置及使用教程
Aug 28 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
Aug 02 jQuery
在vscode 中设置 vue模板内容的方法
Sep 02 Javascript
vue3 自定义图片放大器效果的示例代码
Jul 23 Vue.js
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程序中的常见漏洞进行攻击
2006/10/09 PHP
PHP中用header图片地址 简单隐藏图片源地址
2008/04/09 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
PHP开发框架kohana中处理ajax请求的例子
2014/07/14 PHP
PHP发送短信代码分享
2015/08/11 PHP
再推荐十款免费的php开发工具
2015/11/09 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
Yii框架的redis命令使用方法简单示例
2019/10/15 PHP
Javascript模块模式分析
2008/05/16 Javascript
JavaScript使用技巧精萃[代码非常实用]
2008/11/21 Javascript
jQuery的实现原理的模拟代码 -3 事件处理
2010/08/03 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
javascript中this指向详解
2016/04/23 Javascript
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
详解jquery和vue对比
2019/04/16 jQuery
vue-router路由模式详解(小结)
2019/08/26 Javascript
Layui事件监听的实现(表单和数据表格)
2019/10/17 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
[44:10]2018DOTA2亚洲邀请赛 4.5 淘汰赛 EG vs VP 第一场
2018/04/06 DOTA
Python日志模块logging简介
2015/04/13 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
python正则实现计算器功能
2017/12/14 Python
详细解读tornado协程(coroutine)原理
2018/01/15 Python
Python中的 is 和 == 以及字符串驻留机制详解
2019/06/28 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
英语道歉信范文
2014/01/09 职场文书
初二生物教学反思
2014/02/03 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
公司委托书格式
2014/08/01 职场文书
python之django路由和视图案例教程
2021/07/26 Python