IE与FireFox中的childNodes区别


Posted in Javascript onOctober 20, 2011

Javascript中,相信大家都试过用getElementsByTagName和childNodes来实现对节点的遍历。但是 getElementsByTagName对复杂的DOM结构遍历明显不如用childNodes,因为childNodes能更好的处理DOM的层次结构,建议在需要进行了遍历时首先使用childNodes!!
但是不幸的是,在IE和FireFox中childNodes有点细微的差别:

<head> <script type="text/javascript"> 
function view(){ 
var childs1=$('FirstDiv').childNodes; 
var childs2=$('SecondDiv').childNodes; 
alert("length of FirstDiv: "+childs1.length+"--length of SecondDiv: "+childs2.length); 
} 
var $=function(id) 
{ return document.getElementById(id); } 
</script> 
</head> 
<html > 
<body onload="view();"> 
<!--第一个遍历对象,节点之间留有空格和回车--> 
<div id="FirstDiv"> 
<div>1</div> 
<div>2</div> 
<div>3</div> 
</div> 
<!--第二个遍历对象,除注释外,节点间无空格回车--> 
<div id="SecondDiv"><div>first</div><div>second</div><div>third</div></div> 
</html>

用IE和Firefox运行会有两个不同的结果:IE的结果是3:3;而Firefox则是7:3。怎么会有这种情况呢?
在结构上,对象1和对象2不同的是对象1的子节点间有回车或者空格,而对象2则是一行写到尾。大家都应该想到了吧,IE是将一个完整标签作为一个节点。而 Firefox除了上述的的情况外,也把一个标签的结束符“>”到下一个标签的起始符“<”之间的内容(除注释外,包括任何的文字、空格、回车、制表符)也算是一个节点了。而且这种节点也有它们自己独特的属性和值--nodeName="#text"。
在实际运用中,Firefox在遍历子节点时,在for循环里不妨加上:
if(childNode.nodeName=="#text") continue;
或者nodeType == 1。
这样,便跳过不需要的操作,使程序运行的更有效率。
附:
Node.ELEMENT_NODE == 1
Node.ATTRIBUTE_NODE == 2
Node.TEXT_NODE == 3
Node.CDATA_SECTION_NODE == 4
Node.ENTITY_REFERENCE_NODE == 5
Node.ENTITY_NODE == 6
Node.PROCESSING_INSTRUCTION_NODE == 7
Node.COMMENT_NODE == 8
Node.DOCUMENT_NODE == 9
Node.DOCUMENT_TYPE_NODE == 10
Node.DOCUMENT_FRAGMENT_NODE == 11
Node.NOTATION_NODE == 12

var node = document.documentElement.firstChild;
if(node.nodeType != Node.COMMENT_NODE)
alert("You should comment your code well!");

Javascript 相关文章推荐
Javascript 阻止javascript事件冒泡,获取控件ID值
Jun 27 Javascript
JQuery Tips(2) 关于$()包装集你不知道的
Dec 14 Javascript
HTML Color Picker(js拾色器效果)
Aug 27 Javascript
jquery操作checked属性以及disabled属性的多种方法
Jun 20 Javascript
JavaScript中string转换成number介绍
Dec 31 Javascript
jQuery简单实现列表隐藏和显示效果示例
Sep 12 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
Jan 18 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
Mar 04 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
Aug 18 Javascript
JavaScript的setter与getter方法
Nov 29 Javascript
layDate插件设置开始和结束时间
Nov 15 Javascript
js前端面试之同步与异步问题详解
Apr 03 Javascript
IE和Firefox的Javascript兼容性总结[推荐收藏]
Oct 19 #Javascript
基于jquery的$.ajax async使用
Oct 19 #Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
Oct 19 #Javascript
模拟select的代码
Oct 19 #Javascript
通过下拉框的值来确定输入框是否可以为空的代码
Oct 18 #Javascript
Notify - 基于jquery的消息通知插件
Oct 18 #Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
Oct 17 #Javascript
You might like
Mysql的常用命令
2006/10/09 PHP
[原创]效率较高的php下读取文本文件的代码
2008/07/02 PHP
php实现的漂亮分页方法
2014/04/17 PHP
php使用Cookie控制访问授权的方法
2015/01/21 PHP
php实现的IMEI限制的短信验证码发送类
2015/05/05 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
学习php设计模式 php实现备忘录模式(Memento)
2015/12/09 PHP
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
python3使用PyMysql连接mysql数据库实例
2017/02/07 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
树莓派实现移动拍照
2019/06/22 Python
Form表单及django的form表单的补充
2019/07/25 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
Python ckeditor富文本编辑器代码实例解析
2020/06/22 Python
如何使用Python自动生成报表并以邮件发送
2020/10/15 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
Cotton On香港网站:澳洲时装连锁品牌
2018/11/01 全球购物
宝信软件JAVA工程师面试经历
2012/08/19 面试题
C语言基础笔试题
2013/04/27 面试题
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
新闻专业推荐信范文
2013/11/20 职场文书
测绘工程专业个人自我评价
2013/12/01 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
铲车司机岗位职责
2014/03/15 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
保护环境的宣传语
2015/07/13 职场文书
MySQL如何解决幻读问题
2021/08/07 MySQL
Mysql中常用的join连接方式
2022/05/11 MySQL