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 相关文章推荐
jQuery 性能优化指南(2)
May 21 Javascript
让div层随鼠标移动的实现代码 ie ff
Dec 18 Javascript
在网页中使用document.write时遭遇的奇怪问题
Aug 24 Javascript
javascript避免数字计算精度误差的方法详解
Mar 05 Javascript
Lab.js初次使用笔记
Feb 28 Javascript
jQuery简单动画变换效果实例分析
Jul 04 Javascript
Vue slot用法(小结)
Oct 22 Javascript
jquery实现二级导航下拉菜单效果实例
May 14 jQuery
解决vue 给window添加和移除resize事件遇到的坑
Jul 21 Javascript
Element PageHeader页头的使用方法
Jul 26 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
Aug 03 Javascript
vue 防止页面加载时看到花括号的解决操作
Nov 09 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
php知道与问问的采集插件代码
2010/10/12 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
ExtJS 入门
2010/10/29 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
js判断变量是否未定义的代码
2020/03/28 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
JavaScript包装对象使用详解
2015/07/09 Javascript
JavaScript中的Object对象学习教程
2016/05/20 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
Node.js实现文件上传的示例
2017/06/28 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
vue基于better-scroll仿京东分类列表
2020/06/30 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
用vue写一个日历
2020/11/02 Javascript
python的中异常处理机制
2018/08/30 Python
python切片的步进、添加、连接简单操作示例
2019/07/11 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
python中remove函数的踩坑记录
2021/01/04 Python
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
西班牙三叶草药房:Farmacias Trébol
2019/05/03 全球购物
英国伦敦的睡衣品牌:Asceno
2019/10/06 全球购物
ECHT官方网站:男女健身服
2020/02/14 全球购物
俄罗斯在线服装店:STOLNIK
2021/03/07 全球购物
西门豹教学反思
2014/02/04 职场文书
电台实习生求职信
2014/02/25 职场文书
大学四年个人自我小结
2014/03/05 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
贷款担保书
2015/01/20 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
详解用Python把PDF转为Word方法总结
2021/04/27 Python