浅析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 相关文章推荐
JQuery 简便实现页面元素数据验证功能
Mar 24 Javascript
Add Formatted Data to a Spreadsheet
Jun 12 Javascript
基于Jquery的实现回车键Enter切换焦点
Sep 14 Javascript
可选择和输入的下拉列表框示例
Nov 05 Javascript
轻量级javascript 框架Backbone使用指南
Jul 24 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
Oct 15 Javascript
Highcharts使用简例及异步动态读取数据
Dec 30 Javascript
js实现的简练高效拖拽功能示例
Dec 21 Javascript
vue iview组件表格 render函数的使用方法详解
Mar 15 Javascript
js将键值对字符串转为json字符串的方法
Mar 30 Javascript
Vue 全局loading组件实例详解
May 29 Javascript
js函数柯里化的方法和作用实例分析
Apr 11 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网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
PHP Reflection API详解
2015/05/12 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
2016/06/20 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
2017/07/20 jQuery
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
基于js实现数组相邻元素上移下移
2020/05/19 Javascript
javascript实现前端input密码输入强度验证
2020/06/24 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
2020/08/04 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
python的urllib模块显示下载进度示例
2014/01/17 Python
Python使用openpyxl读写excel文件的方法
2017/06/30 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
Django中Middleware中的函数详解
2019/07/18 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
python 爬虫百度地图的信息界面的实现方法
2019/10/27 Python
python中的函数递归和迭代原理解析
2019/11/14 Python
详解Python 循环嵌套
2020/07/09 Python
Python通过递归函数输出嵌套列表元素
2020/10/15 Python
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
HashMap和Hashtable的区别
2013/05/18 面试题
在校大学生的职业生涯规划书
2014/03/14 职场文书
五一口号
2014/06/19 职场文书
综治工作汇报材料
2014/10/27 职场文书
2014年企业工会工作总结
2014/11/12 职场文书
仓库保管员岗位职责
2015/02/09 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
Nginx的基本概念和原理
2022/03/21 Servers