浅析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 相关文章推荐
javascript之ESC(第二类混淆)
May 06 Javascript
jQuery实现原理的模拟代码 -6 代码下载
Aug 16 Javascript
Javascript学习笔记 delete运算符
Sep 13 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
Mar 31 Javascript
基于jQuery实现返回顶部实例代码
Jan 01 Javascript
手动初始化Angular的模块与控制器
Dec 26 Javascript
Bootstrap fileinput文件上传预览插件使用详解
May 16 Javascript
Material(包括Material Icon)在Angular2中的使用详解
Feb 11 Javascript
vue中,在本地缓存中读写数据的方法
Sep 21 Javascript
vue-router 手势滑动触发返回功能
Sep 30 Javascript
vue组件之间的数据传递方法详解
Apr 19 Javascript
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
Sep 01 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
通过html表格发电子邮件
2006/10/09 PHP
PHP中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
2016/01/22 Javascript
jQuery插件实现图片轮播特效
2016/06/16 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
Vue动态实现评分效果
2017/05/24 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
2017/06/26 jQuery
使用cookie绕过验证码登录的实现代码
2017/10/12 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
[03:48]2014DOTA2 TI专访71DK夺冠不靠小组赛高排名
2014/07/11 DOTA
[01:17:55]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
Python import自定义模块方法
2015/02/12 Python
名片管理系统python版
2018/01/11 Python
Numpy之文件存取的示例代码
2018/08/03 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
2018/12/28 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
利用Python的turtle库绘制玫瑰教程
2019/11/23 Python
Python实现自动整理文件的脚本
2020/12/17 Python
Python环境搭建过程从安装到Hello World
2021/02/05 Python
美国从事品牌鞋类零售的连锁店:Famous Footwear
2016/08/25 全球购物
美国领先的机场停车聚合商:Airport Parking Reservations
2020/02/28 全球购物
SQL数据库笔试题
2016/03/08 面试题
英语专业个人求职自荐信
2013/09/21 职场文书
学校师德师风自我剖析材料
2014/09/29 职场文书
工程款催款函
2015/06/24 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js