JavaScriptでDOMを再帰的に操作する方法を現役エンジニアが解説【初心者向け】

初心者向けにJavaScriptでDOMを再帰的に操作する方法について現役エンジニアが解説しています。DOMとは、HTMLなどをあつかう機能のことでDOMを操作するとHTMLの取得や変更などを行うことができます。DOMの操作方法やツリー構造など再帰的に処理する構造について解説します。

TechAcademyマガジンは受講者数No.1のオンラインプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。

JavaScriptでDOMを再帰的に操作する方法について、TechAcademyのメンター(現役エンジニア)が実際のコードを使って初心者向けに解説します。

そもそもJavaScriptについてよく分からないという方は、JavaScriptとは何なのかについて解説した記事を読むとさらに理解が深まります。

 

なお本記事は、TechAcademyのオンラインブートキャンプJavaScript/jQuery講座の内容をもとにしています。

 

田島悠介

今回は、JavaScriptに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

JavaScriptでDOMを再帰的に操作する方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

目次

 

JavaScriptでのDOMの操作方法

DOM(Document Object Model)は、HTMLなどをあつかう機能の集まりです。特定のHTML要素の取得や変更など、さまざまな処理が可能です。

HTMLの要素の取得と、取得したHTMLの変更をする方法を1つずつ紹介します。
 
HTMLの取得
HTMLの要素にidを割り当てている場合、getElementById メソッドで取得できます。

下記の例では、idとしてcontentsという名前を割り当てた要素を取得しています。

let contens = document.getElementById('contents');

 
取得したHTML要素の変更
styleの変更をする場合は、styleを.(ドット)でつなげた後にCSSのプロパティ名を指定します。

下記の例では、上記で取得したcontensという変数に格納されている要素のフォントサイズを30pxに変更しています。

contens.style.fontSize = '30px';

CSSのプロパティ名とJavaScriptからアクセスするstyleの名称の対比は下記のサイトで確認できます。
MDNのCSSプロパティリファレンス
 

[PR] JavaScript・jQueryで挫折しない学習方法を動画で公開中

DOMを再帰的に操作する方法

HTMLはツリー構造になっています。

HTML要素の下にbody要素があり、その下にdiv要素、その下に…という具合に階層があります。そして各階層には複数の要素が入ることもあります。

ツリー構造のデータを操作するには再帰的に処理をするのが便利です。

再帰とは、関数の中で自身の関数を呼び出しループのように処理する方法です。再帰的に関数を呼び出すことで、親の要素の中の子要素、子要素の中の子要素と掘り下げるように走査できます。
 

実際に書いてみよう

親となる要素を取得し、その子要素、そのまた子要素というように走査する例を紹介します。

走査だけだと何もおきないので、走査の途中で取得したa要素に文字を30pxにする処理をくわえます。

まずは階層がある下記のHTMLを用意しました。

idにcontentsという名前を割り当てたdiv要素が親となっています。そして子要素の2つ目のdiv要素の中にa要素のリンクがある3階層の構成です。

<div id="contents">
  <div>子のdiv要素1つ目</div>
  <div>子のdiv要素2つ目<br>
    <a href="https://techacademy.jp/">テックアカデミー</a><br>
    <a href="https://junior.techacademy.jp/">テックアカデミージュニア</a>
  </div>
</div>

親要素であるdiv要素を取得して、そこから子の要素を取得し、子の要素の子の要素、、、という具合に再帰的に関数を呼び出します。

function strongLink(node) {
  if(node.nodeName === 'a' || node.nodeName === 'A'){
    node.style.fontSize = '30px';
  }
  for (let i = 0; i < node.childNodes.length; i++) {
    strongLink(node.childNodes[i]);  //再帰的な呼び出し
  }
}

let contens = document.getElementById('contents');
strongLink(contens);

strongLinkという関数を作成しました。

その中で引数の要素の子要素を.childNodesで全て取得しループさせる中で自身の関数であるstrongLinkを呼び出しています。これにより、取得した親要素から子要素へ、子要素の中の子要素、、、という具合に掘り進んで処理をおこないます。

今回は再帰的に関数を実行しながらツリー構造のHTMLを走査する例を簡単にするために、a要素の操作のみとしています。処理が下の階層へ降りていくイメージを確認してください。
 

補足

特定の要素を操作するだけであれば、getElementsByTagNameというメソッドで要素を指定してまとめて取得できます。

getElementsByTagNameメソッドが再帰的に親のHTML要素の下を走査して、指定した要素のHTMLCollectionを取得します。

上記で紹介した処理を、getElementsByTagNameメソッドを使って書き直してみます。

let contens = document.getElementById('contents');
let aList = contens.getElementsByTagName('a');
[...aList].forEach(a => a.style.fontSize = '30px');

同じ処理が3行で完成しました。指定した要素の操作だけをおこなう場合はgetElementsByTagNameメソッドが楽です。

処理のポイントは、getElementsByTagNameメソッドの戻り値が複数の値があり配列に似ているけれど、配列ではないということです。

配列ではないのでforEachで1つずつ処理を実行できません。そこでスプレット構文を使い配列に変換しています。
 

まとめ

HTMLの要素を再帰的に処理する方法を紹介しました。

ツリー構造のデータには再帰処理が便利です。
 

筆者プロフィール

横山茂雄(よこやましげお)

フリーエンジニアとして活動中。サーバーサイドからフロントまで時代の波に合わせてスキルを変化させてきました。

言語、フレームワーク、DB、現場、いずれも転々としながら、筋トレも欠かさない体育会系エンジニアです。TechAcademyジュニアのゲームアプリコースを担当しています。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

 

TechAcademyでは、初心者でも最短4週間でJavaScript・jQueryを使ったWebサービス公開を習得できるオンラインブートキャンプJavaScript/jQuery講座を開催しています。

挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。