本記事では、JavaScriptでgetElementsByClassNameで取得した要素に対してforEachでループ処理を行うとエラー(Uncaught TypeError: *.forEach is not a function)が出力されるので、そのエラーの対処法について解説しています。
JavaScriptの学習におすすめ参考書
改訂3版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで
先輩くん
10万部突破したJavaScriptの本が大幅増補改訂し7年ぶりに発売されたよ!
後輩ちゃん
最新の基本文法から、開発に欠かせない応用トピックまで学ぶことが出来るよ!
綺麗なコードが書けるようになる!
リーダブルコード-より良いコードを書くためのシンプルで実践的なテクニック
先輩くん
より良いコードを書きたい人におすすめの本だよ!
後輩ちゃん
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); // リンゴ バナナ イチゴ
});