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正则表达式验证数字代码
Jan 28 Javascript
js弹出确认是否删除对话框
Mar 27 Javascript
原生js图片轮播效果实现代码
Oct 19 Javascript
jquery实现手机端单店铺购物车结算删除功能
Feb 22 Javascript
JSON与js对象序列化实例详解
Mar 16 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
Apr 04 Javascript
详解Koa中更方便简单发送响应的方式
Jul 20 Javascript
Vue与Node.js通过socket.io通信的示例代码
Jul 25 Javascript
element-ui表格数据转换的示例代码
Aug 24 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
Oct 12 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
Feb 01 Javascript
jQuery使用jsonp实现百度搜索的示例代码
Jul 08 jQuery
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漏洞全解(详细介绍)
2012/11/13 PHP
php编写的简单页面跳转功能实现代码
2013/11/27 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
php结合web uploader插件实现分片上传文件
2016/05/10 PHP
PHP获取数组中指定的一列实例
2017/12/27 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
如何使用Javascript获取距今n天前的日期
2013/07/08 Javascript
DOM 高级编程
2015/05/06 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
nodejs使用redis作为缓存介质实现的封装缓存类示例
2018/02/07 NodeJs
详解Require.js与Sea.js的区别
2018/08/05 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
python cookielib 登录人人网的实现代码
2012/12/19 Python
浅谈五大Python Web框架
2017/03/20 Python
Python SQLite3简介
2018/02/22 Python
python实现一组典型数据格式转换
2018/12/15 Python
python面试题小结附答案实例代码
2019/04/11 Python
Django 外键的使用方法详解
2019/07/19 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
python 两种方法删除空文件夹
2020/09/29 Python
html5的input的required使用中遇到的问题及解决方法
2018/04/24 HTML / CSS
Spanx塑身衣官网:美国知名内衣品牌
2017/01/11 全球购物
光声世纪笔试题目
2012/08/25 面试题
会计专业大学生求职信范文
2014/01/28 职场文书
个人作风建设心得体会
2014/10/22 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
教师岗位职责
2015/02/03 职场文书
办公室行政主管岗位职责
2015/04/09 职场文书
小学班主任心得体会
2016/01/07 职场文书
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
OpenCV-Python实现油画效果的实例
2021/06/08 Python