0

私たちは JavaScript ベースの GIS アプリケーションを開発していますが、誰かが IE9 を起動して、そこでも試してみるまで、すべてが順調に進んでいました。おそらくすでにご想像のとおり、アプリが故障しました。

何らかの不可解な理由で、for..inループを反復できないことが判明しましたchildNodes:

var xmldoc = new ActiveXObject("Msxml2.DOMDocument.6.0");
xmldoc.loadXML("<i18n><item>one</item><item>two</item></i18n>");

var currentItem = xmldoc.getElementsByTagName("i18n")[0].firstChild;

while (currentItem) {
    if (currentItem.nodeType == 1) {
        for (var i in currentItem.childNodes) {
            console.log(currentItem.childNodes[i]);
        }
    }
    currentItem = currentItem.nextSibling;
}

ただし、上記のコードの内部forループを次のように置き換えると、

for (var j = 0; j < currentItem.childNodes.length; j++) {
    console.log(currentItem.childNodes[j]);
}

すべてが期待どおりに機能します-問題なく子ノードをウォークします。

回避策を見つけましたが、この問題が発生する理由が明確でないため、依然としてこの問題に悩まされています。XMLDocumentfor..inの両方の MSDN ドキュメントには、何も言及されていません。

これはバグなのか、それとも IE で有名な文書化されていない奇妙さの別のケースなのか?

4

2 に答える 2

2

簡単な答え:for..in配列の反復には使用しないでください。配列は常にfor()ループで反復する必要があります。非配列オブジェクトのみが を使用する必要がありますfor...in

ここで a を使用する必要がある場合for..inは、 を使用してループをフィルター処理し.hasOwnProperty()、配列自体ではなく配列プロトタイプに属するプロパティでの不要な反復を防ぐ必要があります。

この点はすべての for..inループに当てはまります。コードが堅牢であることを確認するには、.hasOwnProperty()単純なオブジェクトであっても、特に配列では常に でフィルタリングする習慣を身に付ける必要があります。配列には追加のプロパティが含まれていることが既にわかっているためです。

この点については、こちらをご覧ください。

于 2013-08-19T13:52:15.610 に答える
2

まあ、これはバグではありません。なぜなら、DOM 仕様では、数値プロパティが存在する必要があると定義されていないためです。脱糖するitemメソッドだけ[]です。

単に使用しないでくださいfor..in

于 2013-08-19T13:48:58.147 に答える