浅析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 相关文章推荐
js 调整select 位置的函数
Feb 21 Javascript
基于jQuery的360图片展示实现代码
Jun 14 Javascript
jQuery的DOM操作之删除节点示例
Jan 03 Javascript
node.js中的fs.readSync方法使用说明
Dec 17 Javascript
jQuery循环遍历子节点并获取值的方法
Apr 14 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
Jul 21 Javascript
Javascript 获取鼠标当前的位置实现方法
Oct 27 Javascript
用move.js库实现百叶窗特效
Feb 08 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
Dec 19 Javascript
快速了解vue-cli 3.0 新特性
Feb 28 Javascript
JavaScript遍历数组和对象的元素简单操作示例
Jul 09 Javascript
AutoJs实现刷宝短视频的思路详解
May 22 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
基于jquery.Jcrop的头像编辑器
2010/03/01 Javascript
jquery 查找select ,并触发事件的实现代码
2011/03/30 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
用JS在浏览器中创建下载文件
2014/03/05 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
2016/05/27 Javascript
Bootstrap插件全集
2016/07/18 Javascript
最全面的百度地图JavaScript离线版开发
2016/09/10 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
Vee-Validate的使用方法详解
2017/09/22 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
python标准算法实现数组全排列的方法
2015/03/17 Python
python实现字符串和数字拼接
2020/03/02 Python
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
广州一家公司的.NET面试题
2016/06/11 面试题
销售业务实习自我鉴定
2013/09/23 职场文书
地理科学专业毕业生求职信
2013/10/15 职场文书
毕业自荐信
2013/12/16 职场文书
酒店总经理欢迎词
2014/01/08 职场文书
优秀交警事迹材料
2014/01/26 职场文书
安全生产承诺书
2014/03/26 职场文书
竞选村长演讲稿
2014/04/28 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
研究生个人学年总结
2015/02/14 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers
自动在Windows中运行Python脚本并定时触发功能实现
2021/09/04 Python
为什么MySQL8新特性会修改自增主键属性
2022/04/18 MySQL