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 相关文章推荐
juqery 学习之三 选择器 子元素与表单
Nov 25 Javascript
jQuery在html有效在jsp无效的原因及解决方法
Aug 02 Javascript
JS实现关键字搜索时的相关下拉字段效果
Aug 05 Javascript
JS+CSS实现的拖动分页效果实例
May 11 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
Nov 02 Javascript
springmvc接收jquery提交的数组数据代码分享
Oct 28 jQuery
webpack构建换肤功能的思路详解
Nov 27 Javascript
JS运动改变单物体透明度的方法分析
Jan 23 Javascript
webpack4+react多页面架构的实现
Oct 25 Javascript
JavaScript实现新年倒计时效果
Nov 17 Javascript
vue动画效果实现方法示例
Mar 18 Javascript
JS判断数组里是否有重复元素的方法小结
May 21 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弹出错误警告函数扩展性强
2014/01/17 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
一直复略了的一个问题,关于表单重复提交
2007/02/15 Javascript
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
jquery动态添加option示例
2013/12/30 Javascript
jquery选择器需要注意的问题
2014/11/26 Javascript
JS运动基础框架实例分析
2015/03/03 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
jquery代码规范让代码越来越好看
2017/02/03 Javascript
js实现文本上下来回滚动
2017/02/03 Javascript
JS实现的DIV块来回滚动效果示例
2017/02/07 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
BootStrap表单时间选择器详解
2017/05/09 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
2019/04/14 Javascript
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
2020/02/11 Javascript
mpvue实现微信小程序快递单号查询代码
2020/04/03 Javascript
用云开发Cloudbase实现小程序多图片内容安全监测的代码详解
2020/06/07 Javascript
Python获取CPU、内存使用率以及网络使用状态代码
2018/02/08 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
django在开发中取消外键约束的实现
2020/05/20 Python
在keras里面实现计算f1-score的代码
2020/06/15 Python
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
《落花生》教学反思
2014/02/25 职场文书
酒店采购员岗位职责
2014/03/14 职场文书
开门红主持词
2014/04/02 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
篮球比赛通讯稿
2015/07/18 职场文书
运动会通讯稿300字
2015/07/20 职场文书
vue3如何优雅的实现移动端登录注册模块
2021/03/29 Vue.js
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python