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获取地址栏参数
Dec 22 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
May 23 Javascript
js数组的操作详解
Mar 27 Javascript
第九篇Bootstrap导航菜单创建步骤详解
Jun 21 Javascript
js 自带的 map() 方法全面了解
Aug 16 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
Aug 19 Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
May 03 Javascript
浅析node应用的timing-attack安全漏洞
Feb 28 Javascript
vue页面切换过渡transition效果
Oct 08 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
Nov 30 Javascript
扫微信小程序码实现网站登陆实现解析
Aug 20 Javascript
在vue中使用image-webpack-loader实例
Nov 12 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
PHP与javascript对多项选择的处理
2006/10/09 PHP
php中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
php 中文字符串首字母的获取函数分享
2013/11/04 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
PHP 实现链式操作
2021/03/09 PHP
jquery trim() 功能源代码
2011/02/14 Javascript
基于jquery的时间段实现代码
2012/08/02 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
JS+DIV+CSS排版布局实现美观的选项卡效果
2015/10/10 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
Vue使用NPM方式搭建项目
2018/10/25 Javascript
Vue 实时监听窗口变化 windowresize的两种方法
2018/11/06 Javascript
一份超级详细的Vue-cli3.0使用教程【推荐】
2018/11/15 Javascript
Python 正则表达式(转义问题)
2014/12/15 Python
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
python实现linux下使用xcopy的方法
2015/06/28 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
2020/03/10 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
人事档案接收函
2014/01/12 职场文书
学校岗位设置方案
2014/01/16 职场文书
《一件运动衫》教学反思
2014/02/19 职场文书
群众路线剖析材料
2014/09/30 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
学校社团活动总结
2015/05/07 职场文书
培训心得体会怎么写
2016/01/25 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android
java协程框架quasar和kotlin中的协程对比分析
2022/02/24 Java/Android