私は_<div>
_に子__<div>
_を入れています。例えば。
_<div id="niceParent">
<div></div>
<div></div>
<div></div>
<div></div>
</div>
_
document.getElementById("niceParent").children
は配列であると思ったので、forEach
関数でそれらをループしてみました。
_console.log(document.getElementById("niceParent").children[1]);
console.log(document.getElementById("niceParent").children[2]);
console.log(document.getElementById("niceParent").children[3]);
console.log(document.getElementById("niceParent").children[4]);
_
したがって、私は試しました
_document.getElementById("niceParent").children.forEach(function(entry) {
console.log(entry);
});
_
機能していません。私は得る
_TypeError: document.getElementById(...).children.forEach is not a function
_
回避策として、さらに複雑な_for..in
_ループでも試してみました。
_for (var i in document.getElementById("niceParent").children) {
if (document.getElementById("niceParent").children[i].nodeType == 1) console.log(document.getElementById("niceParent").children[i]);
}
_
期待どおりに動作しました。
どうして?
.children
には NodeList
が含まれているため[MDN] 、配列ではありません。 NodeList
オブジェクトは、array-likeオブジェクトであり、.length
プロパティを公開し、のように数値プロパティを持ちます配列ですが、Array.prototype
を継承しないため、配列ではありません。
Array.prototype.slice
を使用して配列に変換できます:
var children = [].slice.call(document.getElementById(...).children);
ECMAScript 6は、反復子と配列のようなオブジェクトを実際の配列に変換するための新しいAPIを導入します: Array.from
[MDN] 。意図がより明確になるため、可能であればそれを使用してください。
var children = Array.from(document.getElementById(...).children);
Element.children
はnot配列です。これはHTMLCollection
と呼ばれるオブジェクトです。これらには配列のメソッドがありません(ただし、length
プロパティはあります)。
ループするには、配列に変換する必要があります。これは Array.prototype.slice
:
var children = Array.prototype.slice.call(document.getElementById("niceParent").children);
children.forEach(…);
_.children
_のようなHTMLCollection
をforEach()
(またはmap()
など)を使用する配列に変換するよりクリーンでよりモダンな方法は、 spread synthax _...
_ in a array _[]
_。
_var children = [...document.getElementById('x').children)];
_
例えば:
_[...document.getElementById('x').children)].forEach(child => console.log(child))
_
これはes6の機能です。最新のすべてのブラウザで動作します。
これを行うこともできます:
NodeList.prototype.forEach = HTMLCollection.prototype.forEach = Array.prototype.forEach;
この後、コレクションでforEachを呼び出すことができます。
document.getElementById("niceParent").children.forEach(...)
最善かつ最も安全な方法は、実際にはforEachがまだ存在しない場合にのみ追加することです。
if (window.NodeList && !NodeList.prototype.forEach) {
NodeList.prototype.forEach = Array.prototype.forEach;
}
if (window.HTMLCollection && !HTMLCollection.prototype.forEach) {
HTMLCollection.prototype.forEach = Array.prototype.forEach;
}