浅析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中对对层的控制
Dec 29 Javascript
javascript Array.prototype.slice的使用示例
Nov 14 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
Jul 02 Javascript
js实现感应鼠标图片透明度变化的方法
Feb 20 Javascript
在线所见即所得HTML编辑器的实现原理浅析
Apr 25 Javascript
AngularJS 自定义过滤器详解及实例代码
Sep 14 Javascript
Vue.js开发环境搭建
Nov 10 Javascript
js从输入框读取内容,比较两个数字的大小方法
Mar 13 Javascript
jquery插件开发之选项卡制作详解
Aug 30 jQuery
详解webpack2+React 实例demo
Sep 11 Javascript
vue和小程序项目中使用iconfont的方法
May 19 Javascript
Vue.js使用axios动态获取response里的data数据操作
Sep 08 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 安全检测代码片段(分享)
2013/07/05 PHP
php用正则表达式匹配URL的简单方法
2013/11/12 PHP
php导入模块文件分享
2015/03/17 PHP
学习YUI.Ext 第四天--对话框Dialog的使用
2007/03/10 Javascript
javascript 的Document属性和方法集合
2010/01/25 Javascript
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
纯JAVASCRIPT图表动画插件Highcharts Examples
2011/04/16 Javascript
实现局部遮罩与关闭原理及代码
2013/02/04 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
vue-i18n实现中英文切换的方法
2020/07/06 Javascript
Python中使用glob和rmtree删除目录子目录及所有文件的例子
2014/11/21 Python
Python中操作文件之write()方法的使用教程
2015/05/25 Python
Python 中pandas.read_excel详细介绍
2017/06/23 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
django数据库自动重连的方法实例
2019/07/21 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
thinkphp5 路由分发原理
2021/03/18 PHP
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
Aosom西班牙:家具在线商店
2020/06/11 全球购物
Lucene推荐的分页方式是什么?
2015/12/07 面试题
Unix如何在一行中运行多个命令
2015/05/29 面试题
宿舍保安职务说明书
2014/02/25 职场文书
工程资料员岗位职责
2014/03/10 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
体育教师个人总结
2015/02/09 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
史上最牛辞职信
2015/05/13 职场文书
经费申请报告
2015/05/15 职场文书
2015上半年个人工作总结
2015/07/27 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis
vite+vue3.0+ts+element-plus快速搭建项目的实现
2021/06/24 Vue.js