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";
- }
- }
できあがったもの
このテキストは赤くならない
このテキストも赤くならない
(子クラス)このテキストは赤くなります
(子クラス)このテキストも赤くなります
(子クラス)このテキストも赤くなります
(子クラス)このテキストも赤くなります