I Love China

技术·人生

技术服务生活
繁體
8月 14th, 2007

ie和firefox下element子节点的不同

今天在更换新模板时,修改了下侧边栏的GoogleNews的显示和隐藏,javascript代码如下

JavaScript Code:
  1. function displayNews()
  2. {
  3.     var pNode = document.getElementById('ctrlNewsBar');
  4.     var oldNode = pNode.firstChild;
  5.     var newNode = document.createElement('a');
  6.     var nextNode = pNode.lastChild;
  7.     newNode.href = 'javascript:hideNews();';
  8.     var txtNode = document.createTextNode('隐藏新闻');
  9.     newNode.appendChild(txtNode);
  10.     pNode.replaceChild(newNode,oldNode);
  11.     nextNode.style.display = "";
  12. }
  13. function hideNews()
  14. {
  15.     var pNode = document.getElementById('ctrlNewsBar');
  16.     var oldNode = pNode.firstChild;
  17.     var newNode = document.createElement('a');
  18.     var nextNode = pNode.lastChild;
  19.     newNode.href = 'javascript:displayNews();';
  20.     var txtNode = document.createTextNode('显示新闻');
  21.     newNode.appendChild(txtNode);
  22.     pNode.replaceChild(newNode,oldNode);
  23.     nextNode.style.display = "none";
  24. }

相关的Html代码如下

html Code:
  1. <div id="ctrlNewsBar" class='right-widget' ><a href="javascript:displayNews();">显示新闻</a><div id="newsBar-bar"></div>
  2. </div>

在IE7下工作正常,但是在Firefox下却无法显示出新闻来。经测试发现,出现问题的地方是在displayNews函数中的var nextNode = pNode.lastChild;这一句中,firefox里显示该句执行后nextNode的nodeType是3,也就是textNode,而不是期望中的element。难道是因为在倒数第二个div结束tag后有一个换行的原因?
为此,做如下测试:编辑一个html文件,代码如下:

html Code:
  1. < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>Test</title>
  6. </head>
  7.  
  8. <body>
  9. <div id='test'><a href="hello.html">hello</a><div id="child">some code</div></div>
  10. <div id='info'></div>
  11. <script language="javascript" type="text/javascript">
  12. <!--
  13. var testNode = document.getElementById('test');
  14. var str = '';
  15. var childNode = testNode.firstChild;
  16. var count = 1;
  17. while(childNode)
  18. {
  19.     str += 'childNode' + count + ' -> nodeType:' + childNode.nodeType + ' -> nodeValue:' + childNode.nodeName + '<br />';
  20.     count ++
  21.     childNode = childNode.nextSibling;
  22. }
  23. document.getElementById('info').innerHTML = str;
  24. -->
  25. </script>
  26. </body>
  27. </html>

这段代码的目的是要输出id为test的节点的子节点的节点类型,同时也能看到它的子节点数。
在IE7下运行的截图如下:
childnode_ie7_1.JPG
在Firefox2下运行的截图如下:
childnode_ff2_1.jpg
通过这两个图,我们看到它们的结果是一样的,跟预想的也是一样的,即test节点有两个子节点,一个是tag为a的节点,另一个是tag为div的节点。
然后修改网页代码,主要修改id为test的div内的部分,修改为如下

Code:
  1. <div id='test'>
  2. <a href="hello.html">hello</a>
  3. <div id="child">some code</div>
  4. </div>
  5. <div id='info'></div>

在IE7下运行的结果是:
childnode_ie7_2.JPG
在Firefox2下运行的结果是
childnode_ff2_2.jpg
从上面两幅图看到它们的运行结果并不一样,
IE7认为test有3个子节点,firefox认为有5个子节点。IE7把第一个子节点A后的换行当作了第2个子节点而忽略了第1个和第3个换行(也就是a前面和div后面的换行);而fireFox把这些换行都当作子节点来处理,所以它认为有5个子节点。-_-
看来以后还是小心行事,尽量不要这样换行。

随机文章:

Leave a Reply