开发者问题收集

JavaScript getAttribute 不起作用

2011-01-04
17663
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] 的函数。哪里错了?我不明白其中的重点。

3个回答

请记住, childNodes 包含文本节点(以及注释节点(如果有)和处理指令(如果有)等)。在尝试使用只有 Element s 才具有的方法之前,请务必检查 nodeType

更新 :2018 年,您可以使用 children 代替,它仅包含 Element 子元素。它受所有现代浏览器以及 IE8-IE11 支持。(旧版 IE 中存在一些怪癖,请参阅链接以获取 polyfill 以解决这些问题。)

T.J. Crowder
2011-01-04

在调用元素特定方法(例如 getAttribute() )之前,请检查 nodeType 属性是否为 1(表示节点是元素)。另外,请忘记 getAttribute()setAttribute() :您几乎不需要它们,它们在 IE 中已损坏,并且无法按照您的想法执行操作。请改用等效的 DOM 属性。在本例中:

var child = objects[i].childNodes[j];
if (child.nodeType == 1 && child.name == 'movie') {
    /* DO SOMETHING */ 
}
Tim Down
2011-01-04

您使用的是什么浏览器?如果是 IE,则需要使用 readAttribute

volpav
2011-01-04