浅析document.createDocumentFragment()与js效率


Posted in Javascript onJuly 08, 2013

document.createDocumentFragment()说白了就是为了节约使用DOM。每次JavaScript对DOM的操作都会改变页面的变现,并重新刷新整个页面,从而消耗了大量的时间。为解决这个问题,可以创建一个文档碎片,把所有的新节点附加其上,然后把文档碎片的内容一次性添加到document中。
这是我写的一个简单的测试页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>document.createDocumentFragment()测试页面</title>
</head>
<body>
<script type="text/javascript">
       var d1 = new Date();
       for(var i=0;i<1000;i++)
       {
              var op=document.createElement("P");
              var oText=document.createTextNode("test1");
              op.appendChild(oText);
              document.body.appendChild(op);
       }
       var d2 = new Date();
       document.write("方法一用时:" + (d2.getTime() - d1.getTime()) + "<br/>");
       //---+-----
       var d3 = new Date();
       var oFrag=document.createDocumentFragment();
       for(var i=0;i<1000;i++)
       {
              var op=document.createElement("P");
              var oText=document.createTextNode("test2");
              op.appendChild(oText);
              oFrag.appendChild(op);
       }
       document.body.appendChild(oFrag);
       //这段代码中
       var d4 = new Date();
       document.write("方法二用时:" + (d4.getTime() - d3.getTime()) + "<br/>");
</script>
</body>
</html>

一旦把节点添加到document.body(或其后的节点)中,页面就会立即反映出这个变化。对于第一小段程序,运行是没有任何问题的,但问题是它调用了十次document.body.appendChild(),每次要产生一次页面刷新,这样会产生很多页面碎片。而第二小段代码,document.body.appendChild()仅调用了一次,这意味着只需要进行一次页面的刷新,需要的时间显然会比前面的要少。
我用了三种浏览器测试上面的测试代码,大致得出的结果为:
IE7:
       方法一用时:140
       方法二用时:125
Firefox:
       方法一用时:66
       方法二用时:43
Chrome:
       方法一用时:35
       方法二用时:25
得出的结果还是和理论上的一致了。
Javascript 相关文章推荐
Add a Picture to a Microsoft Word Document
Jun 15 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
Nov 07 Javascript
js实现键盘Enter键提交表单的方法
May 27 Javascript
JavaScript获取并更改input标签name属性的方法
Jul 02 Javascript
利用jquery制作滚动到指定位置触发动画
Mar 26 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
Aug 17 Javascript
JavaScript实现解析INI文件内容的方法
Nov 17 Javascript
详解angular element()方法使用
Apr 08 Javascript
javascript实现最长公共子序列实例代码
Feb 05 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
Apr 17 Javascript
JS实现骰子3D旋转效果
Oct 24 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
Sep 24 Javascript
如何使用Javascript获取距今n天前的日期
Jul 08 #Javascript
解析使用JS 清空File控件的路径值
Jul 08 #Javascript
使用JS 清空File控件的路径值
Jul 08 #Javascript
JS 修改URL参数(实现代码)
Jul 08 #Javascript
解析javascript系统错误:-1072896658的解决办法
Jul 08 #Javascript
浅谈JavaScript之事件绑定
Jul 08 #Javascript
JS Map 和 List 的简单实现代码
Jul 08 #Javascript
You might like
php下MYSQL limit的优化
2008/01/10 PHP
php visitFile()遍历指定文件夹函数
2010/08/21 PHP
PHP实现基于mysqli的Model基类完整实例
2016/04/08 PHP
PHP微信API接口类
2016/08/22 PHP
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
jquery(live)中File input的change方法只起一次作用的解决办法
2011/10/21 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
深入浅析ng-bootstrap 组件集中 tabset 组件的实现分析
2019/07/19 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
es6数组includes()用法实例分析
2020/04/18 Javascript
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
python获取地震信息 微信实时推送
2019/06/18 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
2020/11/25 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
2014/02/16 面试题
融资租赁计划书
2014/04/29 职场文书
学习型党组织建设经验材料
2014/05/26 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
2014年连锁店圣诞节活动方案
2014/12/09 职场文书
社区安全温馨提示语
2015/07/14 职场文书
整脏治乱工作简报
2015/07/21 职场文书
大学开学感言
2015/08/01 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
三十年再续同学情倡议书
2019/11/27 职场文书
TS 类型收窄教程示例详解
2022/09/23 Javascript