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 相关文章推荐
Javascript - HTML的request类
Jul 15 Javascript
编写高性能的JavaScript 脚本的加载与执行
Apr 19 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
Nov 02 Javascript
javascript正则表达式模糊匹配IP地址功能示例
Jan 06 Javascript
JavaScrip数组删除特定元素的几种方法总结
Sep 06 Javascript
bootstrap日期插件daterangepicker使用详解
Oct 19 Javascript
jquery中有哪些api jQuery主要API
Nov 20 jQuery
使用Angular CLI进行Build(构建)和Serve详解
Mar 24 Javascript
使用Vue生成动态表单
Nov 26 Javascript
jQuery实现的移动端图片缩放功能组件示例
May 01 jQuery
基于js实现数组相邻元素上移下移
May 19 Javascript
three.js如何实现3D动态文字效果
Mar 03 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/06 新手入门
PHP7+Nginx的配置与安装教程详解
2016/05/10 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
PHP设计模式之组合模式定义与应用示例
2020/02/01 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
jQuery实现页面内锚点平滑跳转特效的方法总结
2015/05/11 Javascript
使用 bootstrap modal遇到的问题小结
2016/11/09 Javascript
微信小程序模版渲染详解
2018/01/26 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
通过cordova将vue项目打包为webapp的方法
2019/02/02 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
为什么Python中没有&quot;a++&quot;这种写法
2018/11/27 Python
python交换两个变量的值方法
2019/01/12 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
python tornado修改log输出方式
2019/11/18 Python
python归并排序算法过程实例讲解
2020/11/04 Python
python 实现一个图形界面的汇率计算器
2020/11/09 Python
Html5获取高德地图定位天气的方法
2019/12/26 HTML / CSS
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
如何掌握自荐信格式呢
2013/11/19 职场文书
电子商务专业自我鉴定
2013/12/18 职场文书
创业计划书中包含的9个方面
2013/12/26 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
高中学生评语大全
2014/04/25 职场文书
中考标语大全
2014/06/05 职场文书
公司离职证明范本
2014/10/17 职场文书
因工资原因离职的辞职信范文
2015/05/12 职场文书
Vue Element-ui表单校验规则实现
2021/07/09 Vue.js
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS