icon
icon

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

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

テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日  調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名  調査手法:インターネット調査

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

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

 

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

 

田島悠介

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

大石ゆかり

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

田島悠介

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

大石ゆかり

お願いします!

 

目次

1時間でできる無料体験!

 

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] フロントエンドで副業する学習方法を動画で公開中

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つずつ処理を実行できません。そこでスプレット構文を使い配列に変換しています。
 

コラム

コスパとタイパ、両方結果的に良くなる良くなる学び方とは?

「スクールは高いし時間も縛られて効率が悪い」と考える方は多いと思います。
もちろん、時間も費用もかかることは間違いありません。
ただ 結果的に無駄な学びにお金も時間もかける方がリスクが高いという考えもあります。

コスパ・タイパ最適化の参考として、 テックアカデミー卒業生がスクールを選んだ理由 をご紹介します。

  • ・困ったときに、質問や相談できる相手がいるため挫折しなかった
  • ・プロとして必要なスキルのみを深く学べたので無駄がなかった
  • ・副業案件の提供と納品までのサポートがあったので目的を達成できた

安価・短期間で広く浅く学んでも意味がありません。 本当に自分の目的が達成できるか、それが重要です。
自分にどのスキルや学び方が合っているか、どんな学習方法かなど、お気軽に 無料相談 に参加してみませんか?

カウンセラー・現役のプロへ、何でも気軽に無料相談可能。 30分か60分お好きな時間が選べて、かつ3回まで すべて無料で ご利用できます。
無理な勧誘は一切ない ので、お気軽にご参加ください。

今なら相談した方限定の割引・参加特典付き! 無料相談はこちら

まとめ

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

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

筆者プロフィール

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

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

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

 

大石ゆかり

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

田島悠介

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

大石ゆかり

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

 

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

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

初心者・未経験でもできる。まずはテックアカデミーに相談しよう

プログラミングを独学で学習していて、このように感じた経験はないでしょうか?

  • ・調べてもほしい情報が見つからない
  • ・独学のスキルが実際の業務で通用するのか不安
  • ・目標への学習プランがわからず、迷子になりそう

テックアカデミーでは、このような 学習に不安を抱えている方へ、マンツーマンで相談できる機会を無料で提供 しています。
30分間、オンラインでどんなことでも質問し放題です。

「受けてよかった」と感じていただけるよう カウンセラーやエンジニア・デザイナー があなたの相談に真摯に向き合います。

「自分に合っているか診断してほしい」
「漠然としているが話を聞いてみたい」

こんなささいな悩みでも大丈夫です。

無理な勧誘は一切ありません ので、まずはお気軽にご参加ください。
※体験用のカリキュラムも無料で配布いたします。(1週間限定)

今なら参加者限定の割引特典付き! 無料相談を予約する