浅析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 相关文章推荐
IE与FireFox的兼容性问题分析
Apr 22 Javascript
TextArea 控件的最大长度问题(js json)
Dec 16 Javascript
jQuery中读取json文件示例代码
May 10 Javascript
移动节点的jquery代码
Jan 13 Javascript
JS数组的常见用法实例
Feb 10 Javascript
javascript实现方法调用与方法触发小结
Mar 26 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
Jan 24 Javascript
浅谈Vue Element中Select下拉框选取值的问题
Mar 01 Javascript
vue项目tween方法实现返回顶部的示例代码
Mar 02 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
Sep 13 Javascript
微信小程序关键字变色实现代码实例
Dec 13 Javascript
JS函数参数的传递与同名参数实例分析
Mar 16 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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
PHP 和 XML: 使用expat函数(一)
2006/10/09 PHP
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
PHP array_multisort()函数的使用札记
2011/07/03 PHP
PHP基础知识回顾
2012/08/16 PHP
解析smarty模板中类似for的功能实现
2013/06/18 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
extjs 为某个事件设置拦截器
2010/01/15 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
js style动态设置table高度
2014/10/21 Javascript
javascript面向对象之this关键词用法分析
2015/01/13 Javascript
JavaScript简介
2015/02/15 Javascript
JavaScript实现多个重叠层点击切换效果的方法
2015/04/24 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
MVC Ajax Helper或Jquery异步加载部分视图
2015/11/29 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
angularJS利用ng-repeat遍历二维数组的实例代码
2017/06/03 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
2017/12/14 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
详解Vue实战指南之依赖注入(provide/inject)
2018/11/13 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
python函数局部变量用法实例分析
2015/08/04 Python
Python3实现腾讯云OCR识别
2018/11/27 Python
Python实现随机创建电话号码的方法示例
2018/12/07 Python
python与字符编码问题
2019/05/24 Python
如何用python写个模板引擎
2021/01/14 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
个人思想理论学习的自我鉴定
2013/11/30 职场文书
合同专员岗位职责
2013/12/18 职场文书
收银出纳员岗位职责
2014/02/23 职场文书
我的中国梦口号
2014/06/16 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
升学宴祝酒词
2015/08/11 职场文书
执行力心得体会范文
2016/01/11 职场文书
python中的被动信息搜集
2021/04/29 Python