var objects = document.getElementsByTagName('object');
for (var i=0, n=objects.length;i<n;i++) {
objects[i].style.display='none';
var swfurl;
var j=0;
while (objects[i].childNodes[j]) {
if (objects[i].childNodes[j].getAttribute('name') == 'movie') {
/* DO SOMETHING */
}
j++;
}
var newelem = document.createElement('div');
newelem.id = '678297901246983476'+i;
objects[i].parentNode.insertBefore(newelem, objects[i]);
new Gordon.Movie(swfurl, {id: '678297901246983476'+i, width: 500, height: 400});
}
它说getAttribute不是childNodes [j]的函数。怎么了?我没有看到这一点。
答案 0 :(得分:8)
请记住,childNodes
包括文本节点(和注释节点,如果有的话,以及处理指令,如果有的话,等等)。在尝试使用仅nodeType
的方法之前,请务必检查Element
s。
更新:在2018年,您可以改为使用children
,其中只包含Element
个孩子。它受到所有现代浏览器和IE8-IE11的支持。 (旧的IE中有一些怪癖,请参阅polyfill的链接以平滑它们。)
答案 1 :(得分:6)
在调用特定于元素的方法(例如nodeType
)之前,检查getAttribute()
属性是否为1(表示节点是元素)。另外,忘记getAttribute()
和setAttribute()
:你几乎从不需要它们,它们在IE中被破坏了,它们没有你想到的那样。请改用等效的DOM属性。在这种情况下:
var child = objects[i].childNodes[j];
if (child.nodeType == 1 && child.name == 'movie') {
/* DO SOMETHING */
}
答案 2 :(得分:-5)
您使用的浏览器是什么?如果是IE,则需要使用readAttribute
。
- 帕维尔