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.prop() 使用详解
Jul 19 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
Jan 26 Javascript
canvas绘制环形进度条
Feb 23 Javascript
jQuery Masonry瀑布流布局神器使用详解
May 25 jQuery
AngularJS实用基础知识_入门必备篇(推荐)
Jul 10 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
Jul 09 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
Jul 10 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
Sep 07 Javascript
Vue CLI3基础学习之pages构建多页应用
Jun 02 Javascript
Vue项目环境搭建详细总结
Sep 26 Javascript
JavaScript事件循环及宏任务微任务原理解析
Sep 02 Javascript
Vue和Flask通信的实现
May 19 Vue.js
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实现网上点歌(二)
2006/10/09 PHP
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
php获取远程图片体积大小的实例
2013/11/12 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
2019/03/27 PHP
PHP微信网页授权的配置文件操作分析
2019/05/29 PHP
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
Javascript技术栈中的四种依赖注入详解
2016/02/23 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
ES6学习教程之模板字符串详解
2017/10/09 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
vue-cli2.9.3 详细教程
2018/04/23 Javascript
webpack4的迁移的使用方法
2018/05/25 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
vue3.0搭配.net core实现文件上传组件
2020/10/29 Javascript
Python实现替换文件中指定内容的方法
2018/03/19 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
python numpy数组复制使用实例解析
2020/01/10 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
2021/02/20 Python
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
新学期红领巾广播稿
2014/01/14 职场文书
高一新生军训感言
2014/03/02 职场文书
2014年关于两会精神的心得体会
2014/03/17 职场文书
汉语专业毕业生自荐信
2014/07/06 职场文书
四风查摆问题自查报告
2014/10/10 职场文书
银行反洗钱宣传活动总结
2015/05/08 职场文书
2015年路政工作总结
2015/05/22 职场文书
2016新年致辞
2015/08/01 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书
Oracle使用别名的好处
2022/04/19 Oracle
Zabbix对Kafka topic积压数据监控的解决方案
2022/07/07 Servers