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 相关文章推荐
JS日历 推荐
Dec 03 Javascript
JS获取浏览器版本及名称实现函数
Apr 02 Javascript
jQuery选择器querySelector的使用指南
Jan 23 Javascript
JS中产生标识符方式的演变
Jun 12 Javascript
jquery实现网页的页面平滑滚动效果代码
Nov 02 Javascript
node+express制作爬虫教程
Nov 11 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
Dec 25 Javascript
Javascript中构造函数要注意的一些坑
Jan 23 Javascript
在vue中使用公共过滤器filter的方法
Jun 26 Javascript
Angular6 写一个简单的Select组件示例
Aug 20 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
Jun 10 Javascript
js实现点击选项置顶动画效果
Aug 25 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如何抛出异常处理错误
2011/03/02 PHP
php获取当前时间的毫秒数的方法
2014/01/26 PHP
采用memcache在web集群中实现session的同步会话
2014/07/05 PHP
php接口技术实例详解
2016/12/07 PHP
yii2实现分页,带搜索的分页功能示例
2017/01/07 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
7个JS基础知识总结
2014/03/05 Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
2016/02/19 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
详解vue数据渲染出现闪烁问题
2017/06/29 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
2017/12/29 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
2019/07/06 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
vue和iview实现Scroll 数据无限滚动功能
2019/10/31 Javascript
vue fetch中的.then()的正确使用方法
2020/04/17 Javascript
[19:59]2014DOTA2国际邀请赛 IG战队纪录片
2014/08/07 DOTA
Python解析xml中dom元素的方法
2015/03/12 Python
python UNIX_TIMESTAMP时间处理方法分析
2016/04/18 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
2021/02/07 Python
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
物流管理专业大学生自荐信
2013/10/04 职场文书
食品安全承诺书
2014/05/22 职场文书
教师工作自我鉴定范文
2014/09/14 职场文书
2015年学校禁毒工作总结
2015/05/27 职场文书
学困生转化工作总结
2015/08/13 职场文书
实验心得体会范文
2016/01/25 职场文书
Golang: 内建容器的用法
2021/05/05 Golang
Java实现学生管理系统(IO版)
2022/02/24 Java/Android