JavaScript getAttribute不起作用

ica*_*ant 2 javascript

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});
}
Run Code Online (Sandbox Code Playgroud)

它说getAttribute不是childNodes [j]的函数.怎么了?我没有看到这一点.

T.J*_*der 8

请记住,childNodes包括文本节点(和注释节点,如果有的话,以及处理指令,如果有的话,等等).nodeType在尝试使用只有Element方法之前一定要检查.

更新:在2018年,你可以使用children,只包括Element儿童.它受到所有现代浏览器和IE8-IE11的支持.(旧的IE中有一些怪癖,请参阅polyfill的链接以平滑它们.)

  • @Andy E:我会说,"孩子们"还没有得到足够好的支持,可以在一般网站上使用. (2认同)

Tim*_*own 6

nodeType在调用特定于元素的方法之前,检查属性是否为1(表示节点是元素)getAttribute().此外,忘记getAttribute()并且setAttribute():你几乎从不需要它们,它们在IE中被破坏了,它们没有做你想象的那样.请改用等效的DOM属性.在这种情况下:

var child = objects[i].childNodes[j];
if (child.nodeType == 1 && child.name == 'movie') {
    /* DO SOMETHING */ 
}
Run Code Online (Sandbox Code Playgroud)