【小技】JavaScriptでgetElementsByClassNameで要素を取得したときに配列に格納する


2018年7月9日

※ タイトルに誤りがありました。大変失礼しました。
× getElementsByClass
○ getElementsByClassName

皆様大変ご無沙汰しています!
ホワイトボードの末ちゃんこと末吉です。

さて、今回ちょっとした小技を紹介します。
JavaScriptでdocument.getElementsByClassNameで要素を取得したとき、
配列にならずに困ることありますよね。

それの対策方法お伝えします。

まずは要素を取得する

以下のHTMLがあったとしましょう。

<input type="checkbox" class="test_element" name="one">
<input type="checkbox" class="test_element" name="two" checked>
<input type="checkbox" class="test_element" name="three">

この要素をJavaScriptで取得するにはこうなります。

const hoge = document.getElementsByClassName('test_element');

条件に沿うときに処理をしたい

動かないパターン・・・

さて、checked のときに何らかの処理をしたいとします。
順当に行くとこんな感じでコードを書くでしょうか。

for (let i = 0; i < hoge.length; i += 1) {
  if (hoge[i].checked === true) {
    console.log(hoge[i].checked);
  }
}

しかし、これは動かないんですね・・・。
なんでかというと実はHTMLCollectionという配列とは違うものが帰ってきます。

Array.prototype

そこで、Array.prototypeを使って配列に変換します。

const fuga = Array.prototype.slice.call(hoge);

そしてループを実行しましょう。hogeをfugaに直します。

for (let i = 0; i < fuga.length; i += 1) {
  if (fuga[i].checked === true) {
    console.log(fuga[i].checked);
  }
}

そうすると・・・

Screen Shot 2018-07-06 at 20.40.07

はい、無事 if が通りました。

まとめ

このようにうっかりすると、なんで?ということがたまにあります。
jQueryを使うと楽なのかもしれませんが、昨今排除する動きもあるし、
実際、そこまでjQueryの機能を使っていないことがほとんど。

せいぜいDOMの操作のための関数しか使わないのに80kbものデータを置くのは、
ネットワークコストが勿体ないですよね。

できる限りvanilla JSで書ければとても良いかなと思います。

それではまたお会いしましょう。

Share Button