JavaScriptで入れ子のClassを取得する方法
はじめに
前回、JavaScriptでClassを取得したい時の設定あれこれの中で「特定の親Classの中の特定の子ClassをJavascriptで記述する場合、for文の二重ループになるので少し複雑になる」というような説明をしました。
では実際に二重ループをどのように記述するのか説明したいと思います。
目次
「getElementsByClassName」のおさらい
これも前回説明していますが、JavaScriptでClassを取得する場合、getElementsByClassName
メソッドを使用します。
その際、下記のようにgetElementsByClassName('クラス名')[0]
と記述する必要があります。
HTML
<p class="js-text_test11">このテキストは赤くなります</p> <p class="js-text_test11">このテキストは赤くならない</p>
JavaScript
document.getElementsByClassName('js-text_test11')[0].style.color = "red";
できあがったもの
このテキストは赤くなります
このテキストは赤くならない
この場合、同じクラスの1番目([0]から数えるので0が一番目)にしかにスタイルが適用されません。
同じClass全てにスタイルを適用させるにはループ処理が必要になります。
ループ処理による「getElementsByClassName」の記述方法
こちらも前回紹介していますが、getElementsByClassName
でループ処理をする場合、for文を使います。
for文によるJavaScriptの記述は以下のようになります。
HTML
<p class="js-text_test21">このテキストは赤くなります</p> <p class="js-text_test21">このテキストも赤くなります</p>
JavaScript
const example21 = document.getElementsByClassName('js-text_test21'); for( i=0; i<example21.length; i++) { example21[i].style.color = "red"; }
できあがったもの
このテキストは赤くなります
このテキストも赤くなります
「getElementsByClassName」で入れ子のClassを取得する方法
それでは次に、「特定の親Class内の特定の子Classのみ取得する方法」つまり入れ子の記述を紹介します。
まずはfor文無しで紹介しますので、構造としてどのようになっているかご確認ください。
HTML
<p class="js-child32">このテキストは赤くならない</p> <p class="js-child31">このテキストも赤くならない</p> <div class="js-parent31"> <p class="js-child31">(子クラス)このテキストは赤くなります</p> <p class="js-child31">(子クラス)このテキストは赤くならない</p> </div> <div class="js-parent31"> <p class="js-child31">(子クラス)このテキストは赤くならない</p> <p class="js-child31">(子クラス)このテキストは赤くならない</p> </div>
JavaScript
document.getElementsByClassName('js-parent31')[0].getElementsByClassName('js-child31')[0].style.color = "red";
できあがったもの
このテキストは赤くならない
このテキストも赤くならない
(子クラス)このテキストは赤くなります
(子クラス)このテキストは赤くならない
(子クラス)このテキストは赤くならない
(子クラス)このテキストは赤くならない
親クラスjs-parent32
内の子クラスjs-child32
のみテキストが赤くなりますが、最初の例と同様に親子それぞれ1番目の要素にしかスタイルが適用されません。
二重ループによる入れ子のClass取得方法
という訳でここからが本題です。
入れ子構造の親クラス・子クラス全ての要素にJavaScriptを適用させるには、親・子それぞれをループ処理(二重ループ)が必要になります。
構造としては、まず親クラスをループさせて、その中で子クラスをループ処理させる、というような記述になります。
HTML
<p class="js-child32">このテキストは赤くならない</p> <p class="js-child31">このテキストも赤くならない</p> <div class="js-parent31"> <p class="js-child31">(子クラス)このテキストは赤くなります</p> <p class="js-child31">(子クラス)このテキストは赤くならない</p> </div> <div class="js-parent31"> <p class="js-child31">(子クラス)このテキストは赤くならない</p> <p class="js-child31">(子クラス)このテキストは赤くならない</p> </div>
JavaScript
const parent = document.getElementsByClassName('js-parent41'); for( x=0; x<parent.length; x++ ){ const child = parent[x].getElementsByClassName('js-child41'); for( y=0; y<child.length; y++ ) { child[y].style.color ="red"; } }
できあがったもの
このテキストは赤くならない
このテキストも赤くならない
(子クラス)このテキストは赤くなります
(子クラス)このテキストも赤くなります
(子クラス)このテキストも赤くなります
(子クラス)このテキストも赤くなります