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 相关文章推荐
YUI的Tab切换实现代码
Apr 11 Javascript
js/jQuery对象互转(快速操作dom元素)
Feb 04 Javascript
js浮点数精确计算(加、减、乘、除)
Dec 26 Javascript
使用documentElement正确取得当前可见区域的大小
Jul 25 Javascript
jQuery弹出遮罩层效果完整示例
Sep 13 Javascript
JavaScript定时器实现的原理分析
Dec 06 Javascript
Vue的MVVM实现方法
Aug 16 Javascript
Angular 5.x 学习笔记之Router(路由)应用
Apr 08 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
Apr 17 jQuery
浅析vue-router中params和query的区别
Dec 24 Javascript
vue element-ui实现input输入框金额数字添加千分位
Dec 29 Javascript
Vue项目接入Paypal实现示例详解
Jun 04 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
第一个无线电台是由谁发明的
2021/03/01 无线电
PHP一些有意思的小区别
2006/12/06 PHP
PHP中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
试用php中oci8扩展
2015/06/18 PHP
PHP实现bitmap位图排序与求交集的方法
2016/07/28 PHP
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
2015/12/10 Javascript
基于javascript实现按圆形排列DIV元素(三)
2016/12/02 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
深入理解Webpack 中路径的配置
2017/06/17 Javascript
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
jQuery 利用ztree实现树形表格的实例代码
2017/09/27 jQuery
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
python3实现指定目录下文件sha256及文件大小统计
2019/02/25 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
django框架用户权限中的session缓存到redis中的方法
2019/08/06 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
python 读写文件包含多种编码格式的解决方式
2019/12/20 Python
Python新手学习装饰器
2020/06/04 Python
python中取绝对值简单方法总结
2020/07/24 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
2020/12/04 Python
华三通信H3C面试题
2015/05/15 面试题
元旦晚会感言
2014/03/12 职场文书
组工干部对照检查材料
2014/08/25 职场文书
出生医学证明书
2014/09/15 职场文书
导游词之无锡丝业博物馆
2019/11/12 职场文书
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS
MySQL七大JOIN的具体使用
2022/02/28 MySQL