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");