JavaScriptでClassを取得したい時の設定あれこれ
はじめに
WEBコーディングにおいてJavaScriptを使用する場合、HTML内のClassを取得するのがその第一歩だと思います。
JavaScriptの使い始めの頃は「こういうケースではどう記述するのか?」と悩んだり、思うように取得できなかったり随分と悩んだ経験があります。
私のJavaScriptは独学ですが、JavaScriptでのClassの取得方法について今一度まとめてみたいと思います。
目次
IDを取得する場合「getElementById」
「Classを取得する」と書いたのに、いきなり別のことをしています。
まぁID取得の方がClassより若干シンプルで後に説明を加えたい点もあるので、まずはIDの取得方法から説明します。
JavaScriptでIDを取得する場合getElementById
メソッドを使用します。
例えば、次のHTMLテキストの色を赤く変えたい場合、document.getElementById('ID名')
と記述し、その後ろに.style.color = "red";
を記述します。
このページではHTML内にJavascriptを記述していますが、Javascriptを同じhtmlファイル内に記述する場合は、変更したい要素(ID・Class)より後ろの行にscriptを記述する必要があります。
HTML
<p id="js-text_test11">このテキストを赤くします</p>
JavaScript
<script> document.getElementById('js-text_test11').style.color = "red"; </script>
できあがったもの
このテキストを赤くします
Classを取得する場合1「getElementsByClassName」
次にClassを取得する場合ですが、Classを取得するJavaScriptのメソッドにはgetElementsByClassName
があります。
ID取得の場合と同じようにdocument.getElementsByClassName('Class名')
と記述します。
試しにID取得と同じように記述してみましたが、結果としてはJavaScriptが適用されませんでした。
できなかった事例
ID取得と同じ記述方法ではJavaScriptが適用されませんでした。
HTML
<p class="js-text_test21">このテキストを赤くします(できない)</p>
JavaScript
document.getElementsByClassName('js-text_test21').style.color = "red";
できあがったもの(できない)
このテキストを赤くします(できない)
JavaScriptでClassを取得する場合、getElementsByClassName('Class名')
の後ろに[0]
を追加する必要があります。
これは、同じID名はそのページ内に1つしか使えない属性なのに対してClass名は複数使えるので、その出現する順番を指定する必要があるためです。
[]
の中の数字はその出現順を表し、0から数えます。
それでは今度は[]
を追記してみます。
HTML
<p class="js-text_test22">このテキストを赤くします(できる)</p> <p class="js-text_test22">このテキストを赤くします(できない)</p>
JavaScript
<script> document.getElementsByClassName('js-text_test22')[0].style.color = "red"; </script>
できあがったもの
このテキストを赤くします(できる)
このテキストを赤くします(できない)
テキストが赤くなったのはjs-text_test22
要素の中でも最初だけでした。
これは[]
の中で要素の出現順を指定しているため、その順番以外の要素はJavaScriptが適用されないためです。
ではClass全てを一括で取得したい場合は、for
でループ処理をしたら良いです。
for
文を使うことで、同じClass名を繰り返し取得できます。
使い方としては以下のようになります。
Class名js-text_test23
をexample23
(名前は任意の物でOK)という変数に宣言し、それをループ処理する事でexample23
の個数分スタイル(テキストを赤くする)を適用させています。
HTML
<p class="js-text_test23">このテキストを赤くします(できる)</p> <p class="js-text_test23">このテキストを赤くします(できた)</p> <p class="js-text_test23">このテキストを赤くします(できた)</p>
JavaScript
const example23 = document.getElementsByClassName('js-text_test23'); for( i=0; i<example23.length;i++) { example23[i].style.color = "red"; }
できあがったもの
このテキストを赤くします(できる)
このテキストを赤くします(できた)
このテキストを赤くします(できた)
Classを取得する場合2「querySelectorAll」
JavaScriptでClassを取得する方法はもう1つquerySelectorAll
メソッドがあります。
querySelectorAll
の場合、IDもClassもどちらも取得できますが、記述の違いとしてはIDなら#
、Classなら.
を追記する必要があります。
Class名の場合、document.querySelectorAll('.クラス名')
のようになります。
querySelectorAll
の場合も[]
が必要になります。
HTML
<p class="js-text_test31">このテキストを赤くします(できる)</p> <p class="js-text_test31">このテキストを赤くします(できた)</p>
JavaScript
const example31 = document.querySelectorAll('.js-text_test31'); for( i=0; i<example31.length;i++) { example31[i].style.color = "red"; }
できあがったもの
このテキストを赤くします(できる)
このテキストを赤くします(できた)
getElementsByClassName
もquerySelectorAll
もどちらもClassが取得できるならquerySelectorAll
を使えば良いというふうに考えてしまいます。
しかし、実はgetElementsByClassName
の方が処理速度は速いとも言われていますし、querySelectorAll
は静的で、リアルタイムな更新に対応できない等の違いがあるみたいです。
複数Classで指定する場合(「A」and「B」)
それでは次に「複数Classで指定する場合」でのJavascriptでの取得方法です。
例えば「Class名A」かつ「Class名B」を含んだClassを指定したい場合は、getElementsByClassName()
の()
の中を半角スペースで区切って記述します。
具体的には以下のように記述します。
HTML
<p class="js-text_test41">このテキストは赤くなりません</p> <p class="js-text_test42">このテキストも赤くなりません</p> <p class="js-text_test41 js-text_test42">このテキストは赤くなります</p>
JavaScript
const example40 = document.getElementsByClassName('js-text_test41 js-text_test42'); for( i=0; i<example40.length;i++) { example40[i].style.color = "red"; }
このテキストは赤くなりません
このテキストも赤くなりません
このテキストは赤くなります
js-text_test41
やjs-text_test42
のみのClassはテキストが赤くならず、両方含んだClassのみテキストが赤くなりました。
複数Classで指定する場合(「A」or「B」)
同様に、今度は「Class名A」または「Class名B」を含んだClassを指定したい場合は('')
内を,
で区切ります。
しかし、orの場合getElementsByClassName
は使用できないみたいです。
実際に試してみました。
できなかった事例
HTML
<p class="js-text_test51">このテキストは赤くなりません</p> <p class="js-text_test52">このテキストも赤くなりません</p> <p class="js-text_test51 js-text_test52">このテキストも赤くなりません</p>
JavaScript
const example51 = document.getElementsByClassName('js-text_test51 , js-text_test52'); for( i=0; i<example51.length;i++) { example51[i].style.color = "red"; }
できあがったもの(できない)
このテキストは赤くなりません
このテキストも赤くなりません
このテキストも赤くなりません
複数のClassをorで指定したい場合、querySelectorAll
メソッドを使うようになります。
HTML
<p class="js-text_test53">このテキストは赤くなります</p> <p class="js-text_test54">このテキストも赤くなります</p> <p class="js-text_test53 js-text_test54">このテキストも赤くなります</p>
JavaScript
const example52 = document.querySelectorAll('.js-text_test53 , .js-text_test54'); for( i=0; i<example52.length;i++) { example52[i].style.color = "red"; }
できあがったもの
このテキストは赤くなります
このテキストも赤くなります
このテキストも赤くなります
特定の親要素内の子Classのみ指定する場合
親がIDでClassが子の場合
親要素がid
で子要素がclass
の入れ子構造の場合、getElementById()
に続けてgetElementsByClassName()
と記述すると取得できます。
HTML
<p class="js-child61">このテキストは赤くなりません</p> <div id="js-parent61"> <p class="js-child61">このテキストは赤くなります</p> </div>
JavaScript
const example61 = document.getElementById('js-parent61').getElementsByClassName('js-child61'); for( i=0; i<example61.length;i++) { example61[i].style.color = "red"; }
このテキストは赤くなりません
このテキストは赤くなります
ただし、親要素がclass
の場合、親要素もgetElementsByClassName()[0]
で記述する必要があります。
ソースを書くとこんな感じです。
document.getElementsByClassName('親のClass')[0].getElementsByClassName('子のClass')[0].style.color="red";
ただしこの場合、親・子ともに1番目の要素にしか適用されないので、for文によるループが必要です。
親・子ともにループが必要(二重ループ)になり、JavaScriptの記述が少し複雑になるため、詳しくは別の機会で説明したいと思います。
親がClassで子がClassの場合(1)
ではあらためて、親子ともにClassの入れ子構造の場合querySelectorAll
メソッドを使用するとシンプルです
その際('')
内を>
で区切ります。
CSSの「子セレクタ」と同じ理屈です。ただしCSS同様、親要素直下のClassでないと適用されません。
HTML
<p class="js-child63">このテキストは赤くなりません</p> <div class="js-parent63"> <p class="js-child63">このテキストは赤くなります</p> <div> <p class="js-child63">このテキストは赤くなりません</p> </div> </div>
JavaScript
const example63 = document.querySelectorAll('.js-parent63 > .js-child63'); for( i=0; i<example63.length;i++) { example63[i].style.color = "red"; }
できあがったもの
このテキストは赤くならない
このテキストは赤くなります
このテキストは赤くならない
親がClassで子がClassの場合(2)
孫セレクタも含めて適用させたい場合、querySelectorAll
メソッドの('')
内の各Classを半角スペースで区切るとできます。
HTML
<p class="js-child64">このテキストは赤くならない</p> <div class="js-parent64"> <p class="js-child64">このテキストは赤くなります</p> <div> <p class="js-child64">このテキストも赤くなります</p> </div> </div>
JavaScript
const example64 = document.querySelectorAll('.js-parent64 .js-child64'); for( i=0; i<example64.length;i++) { example64[i].style.color = "red"; }
このテキストは赤くならない
このテキストは赤くなります
このテキストも赤くなります