createElement与createDocumentFragment的点点区别小结


Posted in Javascript onDecember 19, 2011

网上可以搜到的大部分都是说使用createDocumentFragment主要是因为避免因createElement多次添加到document.body引起的效率问题,比如:

var arrText=["1","2","3","4","5","6","7","8","9","10"]; 
for(var i=0;i<arrText.length;i++){ 
var op=document.createElement("P"); 
var oText=document.createTextNode(arrText[i]); 
op.appendChild(oText); 
document.body.appendChild(op); 
} 
var arrText=["1","2","3","4","5","6","7","8","9","10"]; 
var oFrag=document.createDocumentFragment(); 
for(var i=0;i<arrText.length;i++){ 
var op=document.createElement("P"); 
var oText=document.createTextNode(arrText[i]); 
op.appendChild(oText); 
oFrag.appendChild(op); 
} 
document.body.appendChild(oFrag);

(声明:这是我google的第一个例子,并不代表对原作者有任何意见,原文地址http://www.cnitblog.com/asfman/articles/32614.html)
这个说法并没有错,但是并不严谨,因为像这种用法,主要还是用在目标节点是已存在并且有一部分内容的情况下,比如上面例子中的body元素,如果目标节点并不存在或者为空,完全可以用createElement创建一个相同的元素,操作之后再使用一次appendChild或者replaceChild来达到相同的目的,这样也不存在重复刷新的问题。
虽说我平时都是把两者混着用,但是还是得明白两者之间的一点区别:
第一:
createElement创建的元素可以使用innerHTML,createDocumentFragment创建的元素使用innerHTML并不能达到预期修改文档内容的效果,只是作为一个属性而已。两者的节点类型完全不同,并且createDocumentFragment创建的元素在文档中没有对应的标记,因此在页面上只能用js中访问到。
demo:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
<title></title> 
<style type="text/css"> 
#outer{ height: 200px; border: 1px solid #006400;} 
</style> 
</head> 
<body> 
<div id="outer"> 
</div> 
<input type="button" value="createElement" id="btn_1"/><input type="button" value="createDocumentFragment" id="btn_2"/> 
<script type="text/javascript"> 
var fragment_1 = document.createDocumentFragment(); 
fragment_1.innerHTML = '<p>我是一个粉刷匠</p>'; 
document.body.appendChild(fragment_1); 
var fragment_2 = document.createElement('p'); 
fragment_2.innerHTML = '粉刷本领强'; 
document.body.appendChild(fragment_2); 
</script> 
</body> 
</html>

第二:另一个最主要的区别就是createElement创建的元素可以重复操作,添加之后就算从文档里面移除依旧归文档所有,可以继续操作,但是createDocumentFragment创建的元素是一次性的,添加之后再就不能操作了(说明:这里的添加并不是添加了新创建的片段,因为上面说过,新创建的片段在文档内是没有对应的标签的,这里添加的是片段的所有子节点)。
一个对比的例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
<title></title> 
<style type="text/css"> 
#outer{ height: 200px; border: 1px solid #006400;} 
</style> 
</head> 
<body> 
<div id="outer"> 
</div> 
<input type="button" value="createElement" id="btn_1"/><input type="button" value="createDocumentFragment" id="btn_2"/> 
<script type="text/javascript"> 
function $(id){ 
return document.getElementById(id); 
} 
var outer = $('outer'); 
var inner = $('inner'); 
$('btn_1').onclick = function(){ 
var div = document.createElement('div'); 
div.innerHTML = '<p>测试createElement</p>'; 
document.body.appendChild(div); 
setTimeout(function(){ 
outer.appendChild(div); 
setTimeout(function(){ 
outer.removeChild(div); 
},1000) 
},1000) 
} 
$('btn_2').onclick = function(){ 
var p = document.createElement('p'); 
p.innerHTML = '测试DocumentFragment'; 
var fragment = document.createDocumentFragment(); 
fragment.appendChild(p); 
fragment.innerHTML = '<p>测试DocumentFragment</p>'; 
fragment.innerHTML = '<span>测试DocumentFragment</span>'; 
document.body.appendChild(fragment); 
setTimeout(function(){ 
outer.appendChild(fragment);//报错,因为此时文档内部已经能够不存在fragment了 
setTimeout(function(){ 
outer.removeChild(fragment); 
},1000) 
},1000) 
} 
</script> 
</body> 
</html>
Javascript 相关文章推荐
使用IE的地址栏来辅助调试Web页脚本
Mar 08 Javascript
增强的 JavaScript 的 trim 函数的代码
Aug 13 Javascript
深入理解JQuery keyUp和keyDown的区别
Dec 12 Javascript
浅析AngularJS Filter用法
Dec 28 Javascript
javascript实现label标签跳出循环操作
Mar 06 Javascript
微信小程序自定义组件
Aug 16 Javascript
Angular4实现鼠标悬停3d倾斜效果
Oct 25 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
Nov 08 Javascript
微信小程序实现时间预约功能
Nov 27 Javascript
JavaScript封闭函数及常用内置对象示例
May 13 Javascript
Layui实现数据表格默认全部显示(不要分页)
Oct 26 Javascript
Vue中fragment.js使用方法小结
Feb 17 Javascript
javascript面向对象编程代码
Dec 19 #Javascript
用jQuery模拟页面加载进度条的实现代码
Dec 19 #Javascript
javascript管中窥豹 形参与实参浅析
Dec 17 #Javascript
jquery focus(fn),blur(fn)方法实例代码
Dec 16 #Javascript
JS获取整个页面文档的实现代码
Dec 15 #Javascript
jQuery版仿Path菜单效果
Dec 15 #Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
Dec 14 #Javascript
You might like
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
php安全之直接用$获取值而不$_GET 字符转义
2012/06/03 PHP
php多次include后导致全局变量global失效的解决方法
2015/02/28 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
2018/08/19 PHP
用JavaScript实现UrlEncode和UrlDecode的脚本代码
2008/07/23 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
javascript获取dom的下一个节点方法
2014/09/05 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
2016/04/01 Javascript
第九篇Bootstrap导航菜单创建步骤详解
2016/06/21 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
nodejs中向HTTP响应传送进程的输出
2017/03/19 NodeJs
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
JavaScript实现换肤功能
2017/09/15 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
[01:14]TI珍贵瞬间系列(六):冠军
2020/08/30 DOTA
python批量生成本地ip地址的方法
2015/03/23 Python
用Python抢过年的火车票附源码
2015/12/07 Python
Python性能提升之延迟初始化
2016/12/04 Python
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
利用ctypes获取numpy数组的指针方法
2019/02/12 Python
django 消息框架 message使用详解
2019/07/22 Python
Mac 使用python3的matplot画图不显示的解决
2019/11/23 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
学校运动会加油词
2015/07/18 职场文书
高一作文之乐趣
2019/11/21 职场文书
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL
Vue2项目中对百度地图的封装使用详解
2022/06/16 Vue.js
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android