getElementsByClassName と getElementsByTagName

getElementsByClassNamegetElementsByTagName は、クラス名やタグ名で複数の要素を取得する古くからあるメソッドです。querySelectorAll が登場してからは使用頻度が減りましたが、今でも現役で使われています。

getElementsByClassName

クラス名で要素を取得します。

const items = document.getElementsByClassName('item');
console.log(items.length);

クラス名はドット(.)なしで指定します。複数のクラスを持つ要素を探すときは、スペースで区切ります。

// class="box red" を持つ要素を取得
const redBoxes = document.getElementsByClassName('box red');

getElementsByTagName

タグ名で要素を取得します。

const paragraphs = document.getElementsByTagName('p');
const divs = document.getElementsByTagName('div');

すべての要素を取得したいときは、* を使います。

const allElements = document.getElementsByTagName('*');

HTMLCollection という戻り値

これらのメソッドは NodeList ではなく HTMLCollection を返します。HTMLCollection は「ライブ」なコレクションで、DOM が変更されると自動的に更新されます。

const items = document.getElementsByClassName('item');
console.log(items.length); // 3

// 新しい要素を追加すると…
const newItem = document.createElement('div');
newItem.className = 'item';
document.body.appendChild(newItem);

console.log(items.length); // 4(自動的に更新される!)

querySelectorAll との違い

getElementsByClassName / getElementsByTagName

HTMLCollection を返す。ライブで DOM の変更が反映される。forEach が使えない

querySelectorAll

NodeList を返す。静的で取得時点のスナップショット。forEach が使える

HTMLCollection をループする方法

HTMLCollection には forEach がないので、いくつかの方法があります。

const items = document.getElementsByClassName('item');

// 方法1: for文
for (let i = 0; i < items.length; i++) {
  console.log(items[i].textContent);
}

// 方法2: Array.from で配列に変換
Array.from(items).forEach(item => {
  console.log(item.textContent);
});

// 方法3: スプレッド構文
[...items].forEach(item => {
  console.log(item.textContent);
});

いつ使うか

基本的には querySelector / querySelectorAll で十分ですが、ライブコレクションが必要なときや、パフォーマンスを極限まで追求したいときには getElementsByClassName / getElementsByTagName が役立ちます。