要素を取得する3つのJSメソッド 〜挙動の違いをまとめてみた〜
DOM操作の基本、要素の取得方法ですが、
getElementById
、getElementsByClassName
、querySelector
の3つが代表的なんじゃないでしょうか。
でもそれぞれ微妙に挙動が違うので、それを今回はまとめてみました。
取得できる内容の比較
それぞれ取得できる内容ですが、
以下のHTMLを取得してみようと思います。
<div id="title" class="title">緋色の研究</div>
<div class="title">恐怖の谷</div>
getElementById
<div id="title" class="title">緋色の研究</div>
<div class="title">恐怖の谷</div>
const title = document.getElementById('title');
console.log(title);
// 結果
"<div id='title' class='title'>緋色の研究</div>"
いわずもがなIDをもとに取得するので、
緋色の研究
のHTML要素のみ出力されました。
idは1ページに1つしか定義できませんからね。
getElementsByClassName
<div id="title" class="title">緋色の研究</div>
<div class="title">恐怖の谷</div>
const title = document.getElementsByClassName('title');
console.log(title);
// 結果
"[object HTMLCollection]"
おっと、てっきりtitleのクラスを持つ2つのHTMLが出力されると思いきや、
まさかの[object HTMLCollection]
。
そうなんです。
getElementsByClassName
はそのままでは正しく出力できません。
すべてを出力するためには以下のようにfor文で回して出力します。
const title = document.getElementsByClassName('title');
for ( let i = 0; i < title.length; i ++ ){
console.log(title[i]);
}
// 結果
"<div id='title' class='title'>緋色の研究</div>"
"<div class='title'>恐怖の谷</div>"
補足ですが、getElementsByClassName
は、『Elements』と複数形になっていることに注意してくださいね。
querySelector
querySelectorは、クラスでもIDでも、要素そのものでも指定することができます。
結構万能。
IDはgetElementById同様1つしか出力されない(というか、1つしかもともとIDは定義できない)ので、
複数のクラスを定義した場合を見てみましょう。
ちなみにquerySelectorは先程言ったように、クラスもIDも指定できるので、
引数の指定は('title')
ではなく、クラスの場合は('.title')
、IDの場合は('#title')
としましょう。
<div id="title" class="title">緋色の研究</div>
<div class="title">恐怖の谷</div>
const title = document.querySelector('.title');
console.log(title);
// 結果
"<div id='title' class='title'>緋色の研究</div>"
そうです。
querySelector
は1つ目の要素しか取得しません。
また、getElementsByClassName
のようにfor文で回すこともできません。
IDもクラスも指定できて便利なquerySelector
ですが、
いいことばかりではないのです。
ちなみに、もしすべての要素を取得したいのなら、
querySelectorAll
を使いましょう。
まとめ
基本的にgetElementById
の使用頻度が高いと思いますが、
getElementsByClassName
を使用する際はfor文で回すのを忘れずに…!
また、querySelector
は最初の該当要素しか取得しません!ご注意を!
本記事の next step として juner さんが各メソッドの使えるインスタンスの違いなどをより詳しく書かれていますので、こちらにて紹介させていただきます。
Discussion
ただし、
getElementById
はDocument
かDocumentFragment
でしか使えない ので Event.target 等から探索する場合は大体 querySelector / querySelectorAll になりがちですね。あと、 リスト/コレクション を返す系の違いとしては querySelectorAll 以外は 生きたコレクションが返ってくるところ……でしょうか?( querySelectorAll は スナップショットなので ドキュメント上に要素を追加しても更新されないです。
コメントありがとうございます!仰る通りです!
本記事は初心者向けにざっくりとした説明しか書いていませんが、
junerさんの記事は next step としてとても有用だと思うので、ぜひ記事の末尾にて紹介させていただきました!🙏
もし、不都合がございましたらお知らせください。削除いたします🙏