IDgetElementByIdは一意である必要があり、関数は常に 1 つの要素を返す (またはnull見つからない場合) ため、コードは機能します。
ただし、メソッド
getElementsByClassName、
getElementsByName、
getElementsByTagName、および
getElementsByTagNameNS
は反復可能な要素のコレクションを返します。
メソッド名はヒントを提供します:単数形をgetElement意味しますが、複数形を意味します。getElements
このメソッドquerySelectorはまた、単一の要素をquerySelectorAll返し、反復可能なコレクションを返します。
反復可能なコレクションは、NodeListまたは のいずれかHTMLCollectionです。
getElementsByNameとは両方とも;querySelectorAllを返すように指定されています。NodeList他のgetElementsBy*メソッドは を返すように指定されていますがHTMLCollection、ブラウザーのバージョンによってはこれを異なる方法で実装することに注意してください。
これらのコレクション タイプは両方とも、要素、ノード、または同様のタイプが提供する同じプロパティを提供しません。…<code>(…<code>)の読み取りstyleが失敗するのはそのためです。document.getElementsつまり、 aNodeListまたは anには;HTMLCollectionがありません。styleのみがElementを持っていstyleます。
これらの「配列のような」コレクションは、0 個以上の要素を含むリストであり、それらにアクセスするために反復する必要があります。配列と同様にそれらを反復処理できますが、それらはsとは異なることに注意してください。Array
最新のブラウザーでは、これらのイテラブルを適切な配列に変換できますArray.from。次に、反復メソッドforEachなどの他の配列メソッドを使用できます。
Array.from(document.getElementsByClassName("myElement"))
.forEach((element) => element.style.size = "100px");
Array.fromまたは反復メソッドをサポートしていない古いブラウザーでは、引き続き を使用できますArray.prototype.slice.call。次に、実際の配列の場合と同じように反復できます。
var elements = Array.prototype.slice
.call(document.getElementsByClassName("myElement"));
for(var i = 0; i < elements.length; ++i){
elements[i].style.size = "100px";
}
NodeListまたは自体を反復することもできますがHTMLCollection、ほとんどの場合、これらのコレクションはライブ( MDN docs、DOM spec ) であることに注意してください。つまり、DOM の変更に応じて更新されます。したがって、ループ中に要素を挿入または削除する場合は、誤っていくつかの要素をスキップしたり、無限ループを作成したりしないようにしてください。MDN のドキュメントでは、メソッドがライブ コレクションを返すか静的コレクションを返すかについて常に注意する必要があります。
たとえば、 aは最新のブラウザーNodeListなどでいくつかの反復メソッドを提供します。forEach
document.querySelectorAll(".myElement")
.forEach((element) => element.style.size = "100px");
単純なforループも使用できます。
var elements = document.getElementsByClassName("myElement");
for(var i = 0; i < elements.length; ++i){
elements[i].style.size = "100px";
}
DOM クエリを少し短くし、「1 つの要素」と「要素のコレクション」を抽象化するレイヤーを作成するjQueryのようなライブラリがいくつかあります。
$(".myElement").css("size", "100px");