浅析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 相关文章推荐
ASP中用Join和Array,可以加快字符连接速度的代码
Aug 22 Javascript
层序遍历在ExtJs的TreePanel中的应用
Oct 16 Javascript
CCPry JS类库 代码
Oct 30 Javascript
扩展javascript的Date方法实现代码(prototype)
Nov 20 Javascript
jquery改变tr背景色的示例代码
Dec 28 Javascript
SyntaxHighlighter 3.0.83使用笔记
Jan 26 Javascript
vue.js入门教程之绑定class和style样式
Sep 02 Javascript
webpack独立打包和缓存处理详解
Apr 03 Javascript
vue如何引用其他组件(css和js)
Apr 13 Javascript
React入门教程之Hello World以及环境搭建详解
Jul 11 Javascript
解决微信二次分享不显示摘要和图片的问题
Aug 18 Javascript
详解ES6中的三种异步解决方案
Jun 28 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的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
2015/12/10 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
微信小程序 switch组件详解及简单实例
2017/01/10 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
微信小程序使用车牌号输入法的示例代码
2019/08/20 Javascript
Vue内部渲染视图的方法
2019/09/02 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
2020/07/17 Javascript
Python中的元类编程入门指引
2015/04/15 Python
Linux中Python 环境软件包安装步骤
2016/03/31 Python
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
python使用tensorflow深度学习识别验证码
2018/04/03 Python
python tornado微信开发入门代码
2018/08/24 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
django创建超级用户过程解析
2019/09/18 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
Python用access判断文件是否被占用的实例方法
2020/12/17 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
2021/03/02 Python
python源文件的字符编码知识点详解
2021/03/04 Python
CSS书写规范、顺序和命名规则
2014/03/06 HTML / CSS
人事档案接收函
2014/01/12 职场文书
给小学生的新年寄语
2014/04/04 职场文书
对祖国的寄语大全
2014/04/11 职场文书
建筑工地宣传标语
2014/06/18 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
表彰大会新闻稿
2015/07/17 职场文书
MySQL批量更新不同表中的数据
2022/05/11 MySQL