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 相关文章推荐
基于jquery的不规则矩形的排列实现代码
Apr 16 Javascript
Jquery中ajax方法data参数的用法小结
Feb 12 Javascript
jQuery中nextAll()方法用法实例
Jan 07 Javascript
JS实现选择TextArea内文本的方法
Aug 03 Javascript
有关Promises异步问题详解
Nov 13 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
Aug 17 Javascript
基于vue.js路由参数的实例讲解——简单易懂
Sep 07 Javascript
Vue渲染函数详解
Sep 15 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
Apr 18 jQuery
vue2.0获取鼠标位置的方法
Sep 13 Javascript
vue集成百度UEditor富文本编辑器使用教程
Sep 21 Javascript
vue实现前台列表数据过滤搜索、分页效果
May 28 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
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
使用cookie实现统计访问者登陆次数
2013/06/08 PHP
php创建、获取cookie及基础要点分析
2015/01/26 PHP
PDO::exec讲解
2019/01/28 PHP
JScript中的undefined和&quot;undefined&quot;的区别
2007/03/08 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
js实现的标题栏新消息闪烁提示效果
2014/06/06 Javascript
js控制鼠标事件移动及移出效果显示
2014/10/19 Javascript
JsRender for object语法简介
2014/10/31 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
jQuery实现Tab选项卡切换效果简单演示
2015/11/23 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
2017/10/27 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
详解vue项目中使用token的身份验证的简单实践
2019/03/08 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
2019/04/20 Javascript
[52:32]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第三场 11.18
2020/11/18 DOTA
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
Python中声明只包含一个元素的元组数据方法
2014/08/25 Python
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
python django 访问静态文件出现404或500错误
2017/01/20 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
使用npy转image图像并保存的实例
2020/07/01 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
德国百年厨具品牌WMF美国站:WMF美国
2016/09/12 全球购物
法国家具及室内配件店:home24
2017/01/21 全球购物
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
Linux内核产生并发的原因
2012/07/13 面试题
捷科时代的软件测试笔试题
2015/11/09 面试题
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
《最佳路径》教学反思
2014/04/13 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
Python安装使用Scrapy框架
2022/04/12 Python