JavaScript

【JavaScript】getElementsByClassNameでforEachが使えない時の対処法

本記事では、JavaScriptでgetElementsByClassNameで取得した要素に対してforEachでループ処理を行うとエラー(Uncaught TypeError: *.forEach is not a function)が出力されるので、そのエラーの対処法について解説しています。

JavaScriptの学習におすすめ参考書
改訂3版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで

本書情報
出版社技術評論社
著者山田 祥寛
発売日2023/2/13
ページ数624ページ
レビュー
(Amazon)
(4件)
先輩くん
先輩くん
10万部突破したJavaScriptの本が大幅増補改訂し7年ぶりに発売されたよ!
後輩ちゃん
後輩ちゃん
最新の基本文法から、開発に欠かせない応用トピックまで学ぶことが出来るよ!

綺麗なコードが書けるようになる!
リーダブルコード-より良いコードを書くためのシンプルで実践的なテクニック

本書情報
出版社オライリージャパン
著者Dustin Boswell / Trevor Foucher
発売日2012/6/23
ページ数260ページ
レビュー
(Amazon)
(620件)
先輩くん
先輩くん
より良いコードを書きたい人におすすめの本だよ!
後輩ちゃん
後輩ちゃん
10以上前の書籍ですが、内容は今でも役に立つものばかりです!

querySelectorAllを使う

getElementByClassNameで取得した要素は、HTMLCollectionと呼ばれる配列風のオブジェクトです。このHTMLCollectionにはforEachメソッドの機能が備わっていないため、使うことが出来ません。

しかし、querySelectorAllで取得した要素は、NodeListと呼ばれる配列風のオブジェクトで、forEachメソッドの機能が備わっています。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  </head>
  <body>
    <ul class="fruits">
      <li class="fruits__item">リンゴ</li>
      <li class="fruits__item">バナナ</li>
      <li class="fruits__item">イチゴ</li>
    </ul>
    <script src="index.js"></script>
  </body>
</html>
const fruitsElem = document.querySelectorAll(".fruits__item");

fruitsElem.forEach((element) => {
  console.log(element.textContent); // リンゴ バナナ イチゴ
});

getElementByClassNameでforEachを使えるようにする

通常、getElementByClassNameで取得した要素に対してforEachを使うことは出来ませんが、「Array.fromメソッド」を活用することでエラーを出力させることなく実行することが出来ます。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  </head>
  <body>
    <ul class="fruits">
      <li class="fruits__item">リンゴ</li>
      <li class="fruits__item">バナナ</li>
      <li class="fruits__item">イチゴ</li>
    </ul>
    <script src="index.js"></script>
  </body>
</html>
const fruitsElem = document.getElementsByClassName("fruits__item");
const fruitsArr = Array.from(fruitsElem);
fruitsArr.forEach((element) => {
  console.log(element.textContent); // リンゴ バナナ イチゴ
});

ブログランキング・にほんブログ村へ PVアクセスランキング にほんブログ村