【发布时间】:2011-09-28 03:47:18
【问题描述】:
我正在写一些学术性的东西,我在其中命名了 HTML 元素,例如:
<ns:LinkList id="sitesuteis" cssClass="classone">
<ns:LinkItem id="LI1" href="http://www.ibt.pt/" target="_blank">IBT</ns:LinkItem>
<ns:LinkItem id="LI2" href="http://http://html5demos.com/t/" target="_blank">HTML5 Demos</ns:LinkItem>
<ns:LinkItem id="LI3" href="http://diveintohtml5.ep.io/" target="_blank">Dive into HTML5</ns:LinkItem>
<ns:LinkItem id="LI4" href="http://html5boilerplate.com/" target="_blank">HTML5 Boilerplate</ns:LinkItem>
</ns:LinkList>
现在,我正在尝试使用 JavaScript:
var elements = document.getElementsByTagName('ns:LinkItem');
element = elements[0];
console.log(element.getAttribute('id'));
//I get a correct value in all browsers
获取我的elements[0] 中的所有子节点。它在所有浏览器中都能正常工作,除了 -IE lt 9-
我试过了:
var children = element.getElementsByTagName('ns:LinkItem');
console.log(children.length);
和:
var children = Array();
for (i=0; i<element.childNodes.length; i++){
alert(element.childNodes[i].nodeName);
if (element.childNodes[i].nodeName=="NS:LINKITEM"){
children.push(element.childNodes[i]);
}
}
console.log(children.length);
在两个 console.logs 中,除了 Internet Explorer 8 或更低版本,我在每个浏览器中都得到了正确的长度 (4),我得到了 0。
根据@Shadow Wizard,在Internet Explorer 8 及更低版本中,元素的canHaveChildren 属性为false,这意味着死路,浏览器根本不支持此标记的子节点,与@987654328 相同例如,@ 不能有子节点。我试过了,这是真的。如果我尝试:
element.parentNode
在 Internet Explorer 8 或更低版本中,我得到包含我的标记的 div,而在其他浏览器中,我得到我的父级 <ns:LinkList>。
我真的需要一个 hack 来解决这个问题,但我似乎找不到。
【问题讨论】:
-
什么版本的 IE?有迹象表明 IE 在某些版本中并不总是返回正确的信息。
-
如果这行正确:
var children = element.getElementsByTagName(('xrtml:LinkItem');你有一个额外的开头括号,所以我只是想确保这只是一个错字而不是你的代码。 -
感谢 dtan,这只是一个错字,我编辑了问题
-
您的示例标记未在您的 LinkItem 节点中显示任何子级。他们在你的实际代码中真的有孩子吗?
-
你能发布整个html页面吗?我刚用我的 IE8 试了一下,效果很好……检查一下:i51.tinypic.com/3449um9.png
标签: javascript html internet-explorer dom