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 相关文章推荐
模拟select的代码
Oct 19 Javascript
jquery select动态加载选择(兼容各种浏览器)
Feb 01 Javascript
JS实现鼠标单击与双击事件共存
Mar 08 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
May 10 Javascript
jquery模拟多级复选框效果的简单实例
Jun 08 Javascript
浅谈angular懒加载的一些坑
Aug 20 Javascript
AngularJs基于角色的前端访问控制的实现
Nov 07 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
Mar 02 Javascript
angularjs中ng-bind-html的用法总结
May 23 Javascript
简单的vuex 的使用案例笔记
Apr 13 Javascript
Angular ElementRef简介及其使用
Oct 01 Javascript
JavaScript剩余操作符Rest Operator详解
Jul 20 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基础知识:控制结构
2006/12/13 PHP
php Memcache 中实现消息队列
2009/11/24 PHP
php代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
深入php数据采集的详解
2013/06/02 PHP
php实现网站顶踩功能的完整前端代码
2015/07/19 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
2013/04/07 Javascript
node.js中的fs.read方法使用说明
2014/12/17 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
2017/03/10 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
python生成器表达式和列表解析
2016/03/10 Python
Python工程师面试必备25条知识点
2018/01/17 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
2018/04/26 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
2019/09/02 Python
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
Moda Italia荷兰:意大利男士服装
2019/08/31 全球购物
小学生考试获奖感言
2014/01/30 职场文书
中药专业自荐信范文
2014/03/18 职场文书
运动会开幕式主持词
2014/03/28 职场文书
论文指导教师评语
2014/04/28 职场文书
雷锋式好少年事迹材料
2014/08/17 职场文书
三八妇女节超市活动方案
2014/08/18 职场文书
八项规定个人对照检查材料思想汇报
2014/09/25 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
2016社区平安家庭事迹材料
2016/02/26 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang
整理Python中常用的conda命令操作
2021/06/15 Python