childNodes在IE与Firefox中区别

嗯,这是前几天写一个遍历双层List集合,动态输出对应的表格并且控制固定表头的效果时发现的一个知识点,程序编好后在IE8浏览器下测试没问题,在Firefox35.0.1总是报错,后来发现是IE与FF对HTML元素中的childNodes属性的“理解”不同造成的,这里记录一下,目的在于让自己记得浏览器中还有许多类似的不兼容性的问题,以后编程的时候需要多加的注意,当然,一步步的调试加上精准的定位问题,是解决问题的常用和极佳的方式!

OK,让简单的代码来发话吧!

1:简单的测试代码段一

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>test childNodes</title>
        <script>

            function showChildNodes()
            {
                var parentDiv=document.getElementById("parentDiv");
                var childNodes=parentDiv.childNodes;
                for(var i=0;i<childNodes.length;i++)
                {
                    showChildNode(childNodes[i]);
                }
            }

            function showChildNode(node_)
            {
              var para=document.createElement("p");
              var node=document.createTextNode("[nodeName is : "+node_.nodeName+"],[nodeType is : "+node_.nodeType+"]");
              para.appendChild(node);

              var element=document.getElementById("showDiv");
              element.appendChild(para);
            }
        </script>
    </head>
    <body onload="showChildNodes()">
        <div id="parentDiv">
            <div id="childDiv1">child div 1</div>
            <div id="childDiv2">child div 2</div>
            <div id="childDiv3">child div 3</div>
        </div>
        <div id="showDiv"></div>
    </body>
</html>

  

   1-1:FF下的运行结果如下:

   

   1-2:IE下的运行结果如下:

2:简单的测试代码段二

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>test childNodes</title>
        <script>

            function showChildNodes()
            {
                var parentDiv=document.getElementById("parentDiv");
                var childNodes=parentDiv.childNodes;
                for(var i=0;i<childNodes.length;i++)
                {
                    showChildNode(childNodes[i]);
                }
            }

            function showChildNode(node_)
            {
              var para=document.createElement("p");
              var node=document.createTextNode("[nodeName is : "+node_.nodeName+"],[nodeType is : "+node_.nodeType+"]");
              para.appendChild(node);

              var element=document.getElementById("showDiv");
              element.appendChild(para);
            }
        </script>
    </head>
    <body onload="showChildNodes()">
        <div id="parentDiv"><div id="childDiv1">child div 1</div><div id="childDiv2">childdiv 2</div><div id="childDiv3">child div 3</div></div>
        <div id="showDiv"></div>
    </body>
</html>

  

2-1:FF下的运行结果如下:

   2-2:IE下的运行结果如下:

嗯,看过上面的代码段及其运行结果,应该不言自明了,随便也测试了一下Chrome和Opera他们的运行效果和FF是一样的!

嗯,现象我们明确了,不过原因是什么呢?

网上查看了一些资料,针对这个问题主要是这样的:

1)IE是将一个完整标签作为一个节点。

2)FF是除了将一个完整的标签作为一个节点外,也把一个标签的结束符“>”到下一个标签的起始符“<”之间的内容(除注释外,包括任何的文字、空格、回车、制表符)也算是一个节点了。而且这种节点也有它们自己独特的属性和值--nodeName="#text"。

3:简单的测试代码段三

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>test childNodes</title>
        <script>

            function showChildNodes()
            {
                var parentDiv=document.getElementById("parentDiv");
                var childNodes=parentDiv.childNodes;
                for(var i=0;i<childNodes.length;i++)
                {
                    showChildNode(i,childNodes[i]);
                }
            }

            function showChildNode(index,node_)
            {
              var para=document.createElement("p");
              var node=document.createTextNode(index+"=[nodeName is : "+node_.nodeName+"],[nodeType is : "+node_.nodeType+"]");
              para.appendChild(node);

              var element=document.getElementById("showDiv");
              element.appendChild(para);
            }
        </script>
    </head>
    <body onload="showChildNodes()">
        <div id="parentDiv"><!--hello world--><div id="childDiv1">注释</div>hello world<div id="childDiv2">文字</div>   <div id="childDiv3">空格</div>
<div id="childDiv4">回车换行</div>        <div id="childDiv5">制表符</div></div>
        <div id="showDiv"></div>
    </body>
</html>

   3-1:IE下运行的结果如下(注意:经自己动手实验表明文字对于IE也是一个节点):

   3-2:FF/Chrome/Opera下的运行结果如下:

找到问题差不多就解决了一半的问题,针对以上的问题解决的思路有好多种,我的建议是:

1:通过节点的名称nodeName或者nodeType过滤出自己想要的节点,比如针对上面简单的代码,我们只想要DIV标签子节点,通过一个循环重新组装一个集合就可以了,并且可以实现浏览器的兼容性(注意是部分代码,比较简单就不写全了)

            function showChildNodes()
            {
                var parentDiv=document.getElementById("parentDiv");
                var childNodes=parentDiv.childNodes;
                var array=new Array();
                for(var j=0,k=0;j<childNodes.length;j++)
                {
                   if(childNodes[j].nodeName=="DIV")
                   {
                      array[k++]=childNodes[j];
                   }
                }

                for(var i=0;i<array.length;i++)
                {
                    showChildNode(i,array[i]);
                }
            }

2:遍历的时候通过nodeName或者nodeType过滤掉自己不要想的节点,比如:在for循环时加上

 if(childNodes[i].nodeName=="#text") continue;

3:使用其他替代的方法,比如:node.getElementsByTagName()方法或者getElementsByClassName()方法

附录(判断节点类型的常用方式):

图一:节点类型值和名称常量的对应关系

图二:不同节点的类型值

图三:节点类型、节点名称及其对应的节点返回值

时间: 2024-10-10 06:47:56

childNodes在IE与Firefox中区别的相关文章

盒子模型(BOX Model) 在IE和Firefox中的区别

刚接触用Div布局时,许多人都只针对IE开发.但随着其他标准浏览器在市场中出现的比重越来越大.人们对于标准越来越重视,目前针对W3C进行开发.对IE系列进行兼容已经成为主流. Div标签,作为标准化Web应用来说,已经成为最重要一个名词.甚至在网络上经常出现“DIV+CSS”这类词语来表示标准化Web开发. 曾经在给一个老网站做兼容Firefox时出现一个问题,现在看来这完全不是问题,但在当时着实费了一番脑筋. 当时在将页面中凌乱不堪的结构重新布局时发现,有些Div在Firefox中会多出2px

parentNode、parentElement,childNodes、children 它们有什么区别呢?

parentNode.parentElement,childNodes.children 它们有什么区别呢?parentElement 获取对象层次中的父对象. parentNode 获取文档层次中的父对象. childNodes 获取作为指定对象直接后代的 HTML 元素和 TextNode 对象的集合. children 获取作为对象直接后代的 DHTML 对象的集合. -------------------------------------------------------- pare

firefox中 checkbox属性checked=&quot;checked&quot;已有,但复选框却不显示打钩的原因

最近在调试复选框的应用,在ie没有问题,考虑到兼容性,试试了firefox,遇到了问题. 复选框绑定了click事件,点一次选中,再点击取消选中,依次类推.这个功能在ie中没问题,但是在firefox中测试的时候,前两次都没有问题,可以正常显示选中和取消,但当再去选中的时候,复选框的属性checkbox值变为"checked",没问题,但是复选框却不在显示选中状态,明明属性值改了,但是却不显示勾选,太诡异了.代码修改了却得不到正确的显示状态,纠结了很久,找不到原因. 正解:后来经偶像指

IE Firefox 中ZIndex的高低准则

转的 做网站开发的,免不了要与CSS打交道,最近在做一些效果些,就被IE与FIREFOX里面不的的zIndex准则,搞得哭笑不得,最后得出一个经验,很通俗的(自己都很得意这种说法,不知道在我之前有没有人这样比喻过呢,应该会有吧,只是我不知道罢了) 以下是我对zIndex问题,在IE与FIREFOX里的总结, IE是按辈份定高低,FIREFOX是按年龄定高低 怎么理解呢? 在IE里,不管DIV的zIndex有多高,如果它的父级容器zIndex比对方要低,它是不可能盖得住对方的.也就是说,如果你的父

如何查看Firefox中保存的登录密码

问:以前使用Firefox浏览器登录一个论坛,并且临时申请了一个账号,在使用Firefox登录时选择让它记住密码了,后来,我忘记了那个论坛的密码,但是可以使用Firefox直接登录.现在能不能查看密码具体是什么了?    答:单击Firefox浏览器菜单"工具→选项",打开窗口中的"隐私"选项卡,再单击"密码"选项卡,接下来再单击"查看已保存的密码"按钮,在打开的窗口中便显示所有Firefox已经记录的账号及密码信息,选择具体

&amp;nbsp在IE和FireFox中显示不一致

&nbsp在IE和FireFox中显示不一致 在做新闻发布系统后台登陆界面时,为了界面美观,想在"密码"二字中间添加空格,从而让"用户名"."密    码"."验证码"垂直对齐. 于是在代码中加了两个" ",在FireFox中达到预期效果了: 我们都知道,一个" "为一个字符大小.可我明明已经在"密码"二字中间添加了两个" "了,刚好为一个

Ajax请求在IE和Google Chrome中可以响应,在Firefox中无法响应

在工作中碰到这么一个问题,发送ajax请求,在IE和chrome中可以正常的响应,但是在Firefox中无法响应,代码如下: JS代码: 1 function Sure(obj) { 2 var statu = confirm("是否确认删除?"); 3 if (!statu) { 4 return false; 5 } 6 var objOrderID = obj.id; 7 $.ajax( 8 { 9 type: "Post", 10 url: "/A

Firefox中利用javascript调用本地程序

http://blog.csdn.net/jensonhjt/article/details/1765557 script>function hello () {  netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");  var file = Components.classes["@mozilla.org/file/local;1"].createInstance(

解决chrome和firefox中文件上传本地路径隐藏的问题

如果想上传一张图片,在页面中实现预览,可以获取文件的上传路径,然后在一个<img/>里面显示,文件的上传路径就是<input type="file"/>的value.在IE下是value是等于本地路径的,然而,在chrome和firefox中,出于安全考虑,路径却是匿名,比如,上传E盘中的readme.txt,得到的value却是C:/fakepath/readme.txt. 要在页面显示上传的图片,可以先上传到服务器,然后再下载下来回避这个问题,但这样会有多余