浅析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 相关文章推荐
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
Mar 09 Javascript
客户端限制只能上传jpg格式图片的js代码
Dec 09 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
Mar 30 Javascript
JS获取中文拼音首字母并通过拼音首字母快速查找页面内对应中文内容的方法【附demo源码】
Aug 19 Javascript
js点击时关闭该范围下拉菜单之外的菜单方法
Jan 11 Javascript
Angular ng-animate和ng-cookies用法详解
Apr 18 Javascript
vue和webpack项目构建过程常用的npm命令详解
Jun 15 Javascript
分享一个vue项目“脚手架”项目的实现步骤
May 26 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
Sep 03 jQuery
Layui选项卡制作历史浏览记录的方法
Sep 28 Javascript
js定时器出现第一次延迟的原因及解决方法
Jan 04 Javascript
Vue-router编程式导航的两种实现代码
Mar 04 Vue.js
如何使用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
世界收音机发展史
2021/03/01 无线电
php 无限极分类
2008/03/27 PHP
php htmlentities和htmlspecialchars 的区别
2008/08/18 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
PHP 创建标签云函数代码
2010/05/26 PHP
PHP中redis的用法深入解析
2014/02/20 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
JQuery的Validation插件中Remote验证的中文问题
2010/07/26 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
原生js和jQuery写的网页选项卡特效对比
2015/04/27 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
javascript设置页面背景色及背景图片的方法
2015/12/29 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
纯js实现动态时间显示
2020/09/07 Javascript
React Native日期时间选择组件的示例代码
2018/04/27 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
Angular利用HTTP POST下载流文件的步骤记录
2020/07/26 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
Python实现的简单dns查询功能示例
2017/05/24 Python
详解TensorFlow在windows上安装与简单示例
2018/03/05 Python
Python3实现的字典遍历操作详解
2018/04/18 Python
python爬虫的数据库连接问题【推荐】
2018/06/25 Python
python 画函数曲线示例
2019/12/04 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
物业管理应届生求职信
2013/10/28 职场文书
酒店总经理工作职责
2013/12/13 职场文书
2014年党风廉政建设工作总结
2014/11/19 职场文书
自我工作评价范文
2015/03/06 职场文书
自荐信格式模板
2015/03/27 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL