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 开天辟地入门篇一
Dec 09 Javascript
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
Mar 23 Javascript
js判断横竖屏及禁止浏览器滑动条示例
Apr 29 Javascript
jQuery中:empty选择器用法实例
Dec 30 Javascript
Javascript 是你的高阶函数(高级应用)
Jun 15 Javascript
基于bootstrap3和jquery的分页插件
Jul 31 Javascript
create-react-app 修改为多入口编译的方法
Aug 01 Javascript
JavaScript实现的开关灯泡点击切换特效示例
Jul 08 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
Aug 07 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
Oct 29 Javascript
node中短信api实现验证码登录的示例代码
Jan 20 Javascript
javascript实现数字时钟效果
Feb 06 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中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
Zend Framework路由器用法实例详解
2016/12/11 PHP
javascript 学习之旅 (1)
2009/02/05 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
2014/12/08 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
2016/01/27 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
微信小程序实战之运维小项目
2017/01/17 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
vue element upload实现图片本地预览
2019/08/20 Javascript
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
Python使用MYSQLDB实现从数据库中导出XML文件的方法
2015/05/11 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
python3.6数独问题的解决
2019/01/21 Python
Python常见数字运算操作实例小结
2019/03/22 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
详解python statistics模块及函数用法
2019/10/27 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
Python实现壁纸下载与轮换
2020/10/19 Python
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
财务经理岗位职责
2013/11/09 职场文书
生产车间主管岗位职责
2013/12/28 职场文书
关于廉洁的广播稿
2014/01/30 职场文书
销售经理竞聘书
2014/03/31 职场文书
老师对学生的寄语
2014/04/09 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
义和团口号
2014/06/17 职场文书
建筑安全责任书范本
2014/07/24 职场文书
小学生读书笔记
2015/07/01 职场文书