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 相关文章推荐
关于IE浏览器以及Firefox下的javascript冒泡事件的响应层级
Oct 14 Javascript
jQuery学习笔记 获取jQuery对象
Sep 19 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
Sep 24 Javascript
javascript实现tab切换特效
Nov 12 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
Feb 03 Javascript
JS前端笔试题分析
Dec 19 Javascript
ES2015 Symbol 一种绝不重复的值
Dec 25 Javascript
angular2 ng build部署后base文件路径问题详细解答
Jul 15 Javascript
使用vue.js在页面内组件监听scroll事件的方法
Sep 11 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
Sep 21 Javascript
vue router 组件的高级应用实例代码
Apr 08 Javascript
javascript中闭包closure的深入讲解
Mar 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
php in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
PHP定时自动生成静态HTML的实现代码
2010/06/20 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
2014/02/18 PHP
PHP解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
javascript 得到变量类型的函数
2010/05/19 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
jQuery简易图片放大特效示例代码
2014/06/09 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
React如何利用相对于根目录进行引用组件详解
2017/10/09 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
Python生成随机数的方法
2014/01/14 Python
python下载文件时显示下载进度的方法
2015/04/02 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
windows10下python3.5 pip3安装图文教程
2018/04/02 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
python笔记_将循环内容在一行输出的方法
2019/08/08 Python
Python爬虫:将headers请求头字符串转为字典的方法
2019/08/21 Python
python实现二分类的卡方分箱示例
2019/11/22 Python
TensorFlow 显存使用机制详解
2020/02/03 Python
Python Http请求json解析库用法解析
2020/11/28 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
Html5 页面适配iPhoneX(就是那么简单)
2019/09/05 HTML / CSS
HTML5输入框下拉菜单功能的示例代码
2020/09/08 HTML / CSS
美国创意礼品网站:UncommonGoods
2017/02/03 全球购物
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
社区安全生产月活动总结
2014/07/05 职场文书
安全月宣传标语
2014/10/07 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
淮海战役观后感
2015/06/11 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA