0

我已经阅读了所有关于element.children, 的文档(例如MDN),但我无法让它在 google Chrome 上正常工作。我正在使用的代码段:

<html><head>
    <script src="loadxmldoc.js"></script>
</head>
<body><script>
xmlDoc=loadXMLDoc("books.xml");

    document.write("<table border='1'>");
    var x=xmlDoc.getElementsByTagName("day");
    for (var i=0;i<x.length;i++){
    document.write("<td><table border='1'>");
    document.write("<tr><td>" + x[i].getAttribute("id") + "</td></tr>");

        var y=xmlDoc.getElementsByTagName("time");

        for (var j=0;j<y.length;j++){
            document.write("<tr><td><table border='1'>");
            document.write("<tr><td>Location: " + y[j].getAttribute("id") + ": ");
            document.write("</table></td></tr>");
    }
    document.write("</table></td>");
}
document.write("</table>");
</script></body></html>

问题是,每次getElementsByTagName制作16,而不是 3、3、3、3、1。y.length我确实使用childNodes过,但其中包括文本元素。我用过var y=x.item(i).children;,但它在 Chrome 上不起作用。它确实适用于 FF,这让我相信要么 Chrome 不支持它,要么我在脑海中遗漏了一些东西。但是,我发现的所有文档都说这应该适用于 Chrome。

.children是 Chrome 的正确用法还是有问题?

4

3 回答 3

1

我要感谢@Felix Kling 帮我解答。

仅供参考, .item 在 FF 中起作用的原因是 FF 返回 HTMLCollection 而 Chrome 返回 NodeList。——费利克斯·克林

.children仅适用于 HTMLCollection。NodeList 需要手动完成。我挑选出元素节点并将它们放入一个数组中。

var x=xmlDoc.getElementsByTagName("day");
if(isFirefox){   //alternately, you can detect if HTMLCollection
    var y=x.item(i).children;
    document.write(y.length);
}
if(isChrome){    //alternately, you can detect if NodeList
    var y = new Array();
    var currentChild = x.item(i).firstChild;

    while(currentChild!=null){
        if(currentChild.nodeType == Node.ELEMENT_NODE){
            y[y.length]=currentChild;
        }
        currentChild=currentChild.nextSibling;
    }
}
for (var j=0;j<y.length;j++){
    /* loop */
}
于 2013-07-06T16:55:38.777 回答
0

在我的 Chrome 版本 27 上,以下工作正常:

[].forEach.call (document.body.children, function (e) { console.log (e); });

就像在 Firefox 16 上一样

在http://jsfiddle.net/jstoolsmith/3rBTF/上试试

于 2013-07-06T17:26:26.767 回答
0

Try childNodes,一个标准属性。children属性可能不适用于所有浏览器。

于 2013-07-06T19:51:22.717 回答