JavaScriptのDOMを初心者向けに解説|Javascript入門講座(13)

JavaScript
この記事は約22分で読めます。

JavaScriptのDOMを初心者向けに解説|Javascript入門講座(13)のPodcast

下記のPodcastは、Geminiで作成しました。

はじめに

ウェブサイトを閲覧しているとき、ボタンを押すとメニューが飛び出したり、入力フォームに不備があるとリアルタイムでメッセージが表示されたりするのを不思議に思ったことはありませんか? こうした「ウェブページに動きを与える魔法」を支えているのが、JavaScriptのDOM(Document Object Model)という仕組みです [1]。本講座では、プログラミング初心者の方に向けて、DOMの基本概念から、2025年以降の最新トレンドである安全なHTML操作、さらに効率的なコードの書き方までを、専門用語を噛み砕いて丁寧に解説します。

1. DOMとは何か? ブラウザがページを表示する裏側

DOM(ドム)とは、「Document Object Model」の略称です [2]。一言で言えば、「プログラム(JavaScript)からHTMLやCSSを自由自在に操るための仕組み」を指します [3]

JavaScriptとDOMの意外な関係

ここで多くの初心者が驚く事実があります。実は、DOMはJavaScriptという言語の一部ではありません [4]

JavaScript自体は、計算や条件分岐などを行うプログラミング言語です。一方でDOMは、ブラウザが提供する「Web API」と呼ばれる外部機能の一種です [5]

例えば、サーバー側で動く Node.js などでは、標準ではDOMを操作することはできません。私たちがブラウザ上でリッチな体験を作れるのは、JavaScriptがブラウザの提供するDOMというツールセットにアクセスできるからです [6]

ブラウザがページを描くプロセス

ブラウザがHTMLを読み込んで画面に表示するまでには、「クリティカルレンダリングパス」と呼ばれる一連の工程があります [7]

DOMの構築: HTMLファイルを読み込み、タグの関係性を解析して、メモリ上に「DOMツリー」を作ります [8]

CSSOMの構築: 同時にCSSを読み込み、スタイルのルールをまとめた「CSSOMツリー」を作ります [9]

レンダリングツリーの作成: DOMとCSSOMを合体させ、実際に画面に表示される要素だけの設計図(レンダリングツリー)を作ります [10]

Layout (レイアウト): 各要素のサイズや位置を正確に計算します [11]

Paint (ペイント): 最終的なピクセルを画面に描き出します [12]

JavaScriptでDOMを操作するということは、この工程のどこかに介入して、リアルタイムに設計図を書き換える行為なのです [13]

2. 「DOMツリー」という考え方:階層構造の理解

DOMは、HTMLドキュメントを「木」のような階層構造で管理しています。これをDOMツリーと呼びます [14]

身近な例えで理解する

DOMツリーを理解するには、以下の例えが分かりやすいでしょう [15]

家族の家系図: 頂点に先祖(ドキュメント)がいて、そこから親、子、孫へと枝分かれしていく構造です [16]

学校の組織図: 生徒会、学級、委員会といった所属関係のようなものです [17]

ノード(Node)とは

ツリーを構成する要素の一つひとつを「ノード」と呼びます [18]

ドキュメントノード: ツリーの根っこにあたる document オブジェクトです [19]

要素ノード (Element Node): `<div>` や `<h1>` などのHTMLタグそのものです [20]

テキストノード (Text Node): タグの中に入っている文字情報です [21]

属性ノード (Attribute Node): class や id といった付加情報です [22]

JavaScriptは、このツリーを登ったり降りたりしながら、目的のノードを探し当てて操作します [23]

3. 目的の要素を捕まえる:最新の「要素の選択」

DOMを操作する第一歩は、どの要素を変更したいかをJavaScriptに伝えることです。これを「要素の選択」と言います [24]

推奨される現代的な手法

2025年現在、最も推奨されるのはCSSセレクタを使って要素を指定する方法です [25]

document.querySelector('セレクタ'): 条件に合う「最初の一つ」を取得します [26]

document.querySelectorAll('セレクタ'): 条件に合う「すべて」を取得します [27]

例えば、クラス名が btn の要素を選びたいなら `document.querySelector('.btn')` と書きます。CSSと同じ書き方ができるため、非常に直感的です [28]

従来の手法との違い

古くからある `getElementById()` も、特定のIDを持つ要素をピンポイントで、かつ非常に高速に取得できるため、今でもよく使われます [29]

ただし、初心者のうちは、あらゆるセレクタに対応できる querySelector シリーズを使いこなせるようになるのが上達の近道です [30]

4. コンテンツの書き換え:安全性とパフォーマンス

要素を選択できたら、次はその中身を書き換えてみましょう [31]

主に使われるプロパティは3つありますが、使い分けには注意が必要です [32]

textContent(推奨): 文字だけを書き換えたい場合に最も安全で高速な方法です [33]。タグを含めた文字列を渡しても、そのまま「文字」として表示されます。悪意のあるスクリプトが埋め込まれる心配がないため、セキュリティ的にも非常に優れています [34]

innerHTML(注意が必要): HTMLタグを含めて中身をゴッソリ書き換えることができます [35]。便利ですが、外部からの入力データをそのまま innerHTML に入れると、「クロスサイトスクリプティング(XSS)」というサイバー攻撃の隙を作ってしまいます [36]。また、ブラウザに「HTMLの解析」という重い作業を強いるため、多様は禁物です [37]

innerText(見た目重視): textContent と似ていますが、「実際に画面で見えている通り」のテキストを扱います [38]。例えばCSSで非表示にしている文字は取得しません。便利な一方で、ブラウザが「今どう見えているか」を計算するために少し時間がかかる(リフローが発生する)というデメリットがあります [39]

5. 2025年の新常識:安全なHTML挿入(Baseline 2025)

近年のウェブ開発では、セキュリティの観点から innerHTML の使用を避ける動きが加速しています [40]

2025年以降のモダンブラウザでは、より安全な代替案が「Baseline(標準機能)」として定着しました [41]

setHTML(input, options): HTMLを挿入する前に、ブラウザが自動的に危険なタグ( `<script>` など)を取り除いてくれる「サニタイズ(無害化)」機能付きのメソッドです [42]

setHTMLUnsafe(input): innerHTML に代わる最新メソッドで、特定の技術(宣言的シャドウDOMなど)を正しく解析できます。名前に「Unsafe(安全ではない)」とある通り、信頼できるデータにのみ使用します [43]

これからは、「ただ文字を変えるだけなら textContent 、HTML構造を変えるなら setHTML シリーズ」という使い分けが標準になります [44]

6. スタイルと属性の自由なコントロール

見た目の変更もDOM操作の得意分野です [45]

クラスの付け外し(クラス管理)

直接 `style.color = "red"` のようにスタイルを書き換えることもできますが、おすすめはCSS側でクラスを定義しておき、JavaScriptでそのクラスを「付け外し」する方法です [46]

classList プロパティを使うと、驚くほど簡単に操作できます [47]

`element.classList.add('active')` : クラスを追加

`element.classList.remove('active')` : クラスを削除

`element.classList.toggle('active')` : あれば削除、なければ追加

この方法なら、JavaScriptは「状態の切り替え」に専念し、デザインの詳細はCSSに任せることができるため、コードがスッキリします [48]

属性の操作

リンク先のURL( href )や画像のパス( src )を変更したいときは、 `setAttribute()` や `getAttribute()` を使用します [49]

これを使えば、例えばクリックするたびに画像が切り替わるギャラリーなども簡単に作れます [50]

7. 新しい要素を生み出す:生成と統合

あらかじめHTMLに書いておくのではなく、何もないところから新しい要素をJavaScriptで作ることもできます [51]

3つのステップ

1. 作成: `document.createElement('tagName')` で、メモリ上に新しい要素を誕生させます。

2. 設定: textContent などで中身やクラスを整えます。

3. 追加: 既存のDOMツリーに繋ぎ合わせます。ここで登場するのが `append()` です [52]

append() vs appendChild()

昔の教材では `appendChild()` がよく紹介されていましたが、現代では `append()` が主流です [53]

appendChild(): 古くからあり、ノード(要素)しか追加できません。また、追加した要素を戻り値として返します [54]

append(): 文字列を直接追加できたり、複数の要素を一度に並べて追加できたりと、非常に柔軟です [55]

一度にたくさんの要素をループで追加する場合は、 DocumentFragment という「仮の入れ物」を使うのがプロの技です [56]

まず仮の入れ物に要素を全部並べ、最後に一回だけDOMにガチャンと合体させることで、ブラウザの描画負担を劇的に減らすことができます [57]

8. ユーザーの動きに反応する:最新のイベントハンドリング

「ボタンが押されたら何かをする」という仕組みを「イベントハンドリング」と呼びます [58]

推奨される addEventListener

現代では `addEventListener()` を使うのが鉄則です [59]

このメソッドを使えば、一つのボタンに対して「クリックされた時の処理」をいくつでも追加でき、さらに「一度だけ実行する( `{ once: true }` )」といった便利なオプションも指定可能です [60]

2025年のトレンド:AbortControllerによる一括解除

スクロールイベントなど、ページを離れた後も動き続けるイベントは、メモリの無駄遣いや予期せぬエラーの原因になります [61]

最新のやり方では、 AbortController を使って、不要になった瞬間に複数のイベントを一つの「信号(signal)」で一斉にストップさせることができます [62]

JavaScript

javascript

const controller = new AbortController();
const signal = controller.signal;

window.addEventListener('scroll', scrollHandler, { signal });
window.addEventListener('resize', resizeHandler, { signal });

// 処理を止めたいときに
controller.abort(); 

この「後片付け」を意識することが、一人前の開発者への第一歩です [63]

9. 賢い効率化技術:イベント委譲 (Event Delegation)

大量のリスト項目( li )それぞれにクリックイベントを付けるのは、非常に効率が悪いです [64]

そこで使われるのがイベント委譲です。

イベントは発生した場所から、まるで泡のように親要素へと伝わっていく性質(イベントバブリング)を持っています [65]

これを利用し、親要素( ul )に一つだけイベントを仕掛けておき、 `event.target` を使って「実際にクリックされたのはどの要素か」を判断します [66]

これにより、後から新しく追加されたリスト項目に対して、自動的にイベントが効くようになります [67]

10. 学習の頼もしい味方:デベロッパーツール

DOMの理解を深めるために、ブラウザに隠された「開発者ツール(デベロッパーツール)」を使い倒しましょう [68]

Elementsパネル: 今のDOMがどうなっているか、リアルタイムで確認・編集できます。JavaScriptが要素を書き換えると、その部分がパッと光って教えてくれます [69]

Consoleパネル: `console.dir(element)` と打てば、その要素が持つ膨大なプロパティの中身を、まるでフォルダを覗くように確認できます [70]

「コードを書く」ことと同じくらい、「ツールで挙動を観察する」ことが上達への近道です [71]

11. まとめ:DOMを制する者はウェブを制す

DOMは、静的なHTMLに「生命」を吹き込む魔法の杖です [72]

2025年から2026年にかけての開発環境では、jQueryのような古いライブラリを使わず、ブラウザ標準の機能を使いこなす「バニラJavaScript」のスキルがこれまで以上に高く評価されています [73]

最初はツリー構造が複雑に感じるかもしれませんが、毎日少しずつ querySelector で要素を選んだり、 textContent で文字を変えたりする練習を積み重ねることで、必ず直感的に理解できるようになります [74]

この基礎は、将来ReactやVueといった最新のフレームワークを学ぶ際にも、揺るぎない土台となるでしょう [75]

ウェブの可能性を広げるDOMの世界へ、一歩踏み出してみましょう [76]

参考資料

1. JavaScript DOM 基礎 初心者 MDN, https://developer.mozilla.org/ja/docs/Learn_web_development/Core/Scripting

2. DOM スクリプティング入門, https://developer.mozilla.org/ja/docs/Learn_web_development/Core/Scripting/DOM_scripting

3. JavaScript の紹介, https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Introduction

4. DOM manipulation best practices 2025 modern JavaScript, https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Scripting/DOM_scripting

5. Performance, Security, and Speed: Best Practices for Efficient JavaScript DOM Manipulation, https://medium.com/@mdsiaofficial/performance-security-and-speed-best-practices-for-efficient-javascript-dom-manipulation-36e0a1723b6c

6. Modern JavaScript Features Every Developer Should Master in 2025, https://www.growin.com/blog/javascript-features-for-developers/

7. Mastering JavaScript Functions: DOM Manipulation a Beginner-friendly Deep Dive, https://dev.to/dumebii/mastering-javascript-functions-dom-manipulation-a-beginner-friendly-deep-dive-2935

8. The Foundation Every Web Developer Must Master: DOM Manipulation Explained, https://javascript.plainenglish.io/the-foundation-every-web-developer-must-master-dom-manipulation-explained-5160546851b5

9. DOMは「階層構造」を取る, https://eng-entrance.com/what-is-dom

10. 関数って何?, https://note.com/skipla/n/nb65a0bb4c24c

11. Document Object Model (DOM) - Wikipedia, https://en.wikipedia.org/wiki/Document_Object_Model

12. Document Object Model (DOM) API MDN, https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model

13. WHATWG DOM Standard, https://dom.spec.whatwg.org/

14. WHATWG HTML Standard Infrastructure, https://html.spec.whatwg.org/multipage/infrastructure.html

15. WHATWG HTML Standard DOM, https://html.spec.whatwg.org/multipage/dom.html

16. Common Mistakes to Avoid as a JavaScript Beginner, https://www.wisp.blog/blog/common-mistakes-to-avoid-as-a-javascript-beginner

17. JavaScript DOM Tips and Tricks, https://www.geeksforgeeks.org/blogs/javascript-dom-tips-and-tricks/

18. Stop Using jQuery: Master Vanilla JavaScript DOM Manipulation in 2025, https://dev.to/sizan_mahmud0_e7c3fd0cb68/stop-using-jquery-master-vanilla-javascript-dom-manipulation-in-2025-2kf2

19. Understanding the DOM Tree: A Beginner's Guide to Understanding Web Page Structure, https://dev.to/gautam_kumar_d3daad738680/understanding-the-dom-tree-a-beginners-guide-to-understanding-web-page-structure-2ncd

20. The HTML Document Tree, https://web.simmons.edu/~grovesd/comm244/notes/week4/document-tree

21. Understanding the DOM: A Beginner-Friendly Guide to How Websites Work, https://medium.com/@techwithtwin/understanding-the-dom-a-beginner-friendly-guide-to-how-websites-work-techwithtwin-8b1c30c247d5

22. The DOM Tree - Turing School, https://frontend.turing.edu/lessons/module-1/the-dom-tree.html

23. Understanding the DOM Tree and Nodes, https://www.digitalocean.com/community/tutorials/understanding-the-dom-tree-and-nodes

24. DOM element creation vs innerHTML vs direct, https://stackoverflow.com/questions/8795992/dom-element-creation-vs-innerhtml-vs-direct

25. Creating shadow DOM by innerHTML vs Template, https://gist.github.com/e9bcb6fc88b40fc26ed9e768f7d19961

26. Node.textContent - MDN Web Docs, https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent

27. HTMLElement.innerText - MDN Web Docs, https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText

28. Element.innerHTML - MDN Web Docs, https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML

29. Modern event handling with addEventListener and AbortController, https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener

30. What are the differences between NodeList and HTMLCollection?, https://developer.mozilla.org/en-US/docs/Web/API/NodeList

31. What is HTMLCollection?, https://developer.mozilla.org/en-US/docs/Web/API/HTMLCollection

32. Selection and traversal on the DOM tree, https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Selection_and_traversal_on_the_DOM_tree

33. Modern JavaScript Best Practices 2025, https://ashishmisal.medium.com/modern-javascript-best-practices-you-should-follow-in-2025-74a5a73887db

34. 25 JavaScript Best Practices for Modern Development, https://preparefrontend.com/blog/blog/25-javascript-best-practices-for-modern-development

35. JavaScript Essential Concepts for 2025, https://dev.to/amaresh_adak/javascript-essential-concepts-for-2025-the-modern-developers-roadmap-3ce

36. Node.appendChild() method MDN, https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild

37. The append() vs appendChild() in JavaScript, https://techkluster.com/javascript/append-vs-appendchild/

38. Understanding append vs appendChild in JavaScript, https://medium.com/@yuvaraj.io/lesson-46-understanding-append-vs-appendchild-in-javascript-ea5b4b8a8fc5

39. Beyond the Basics: append vs appendChild, http://oreateai.com/blog/beyond-the-basics-unpacking-the-nuances-of-append-vs-appendchild-in-javascript/a491ad0f37b180859c66e9a31dc6ce9b

40. Mastering Node Appending in the DOM, https://javascript.plainenglish.io/chapter-89-mastering-node-appending-in-the-dom-a-deep-dive-into-appendchild-and-append-da2e8ba39188

41. Event Delegation in JavaScript: The Secret to Efficient Event Handling, https://medium.com/@zackr996512/event-delegation-in-javascript-the-secret-to-efficient-event-handling-677b4131c471

42. Deep Internals of Event Delegation, https://blog.logrocket.com/deep-internals-event-delegation/

43. Event delegation and event propagation in JavaScript, https://love-coding.pl/en/event-delegation-and-event-propagation-in-javascript/

44. Event Delegation in Modern Frameworks, https://medium.com/@bharathofficial05/event-delegation-in-modern-frameworks-022c61af5e71

45. Understanding JavaScript Event Delegation, https://namastedev.com/blog/understanding-javascript-event-delegation-2/

46. Working with events, https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Scripting/Events

47. ブラウザのレンダリングの仕組み(DOM, CSSOM, レンダリングツリー), https://developer.mozilla.org/ja/docs/Web/Performance/Critical_rendering_path

48. JavaScript DOM デバッグ Chrome DevTools 使い方 初心者, https://developer.chrome.com/docs/devtools/javascript?hl=ja

49. Chromeデベロッパーツールの日本語化と使い方, https://qiita.com/ktdatascience/items/fa7627f330d7dea8e637

50. Chromeデベロッパーツールの起動方法, https://ga4.hideharublog.com/chrome-developers-tool-how-to-use/

51. JavaScript DOM メモリリーク 原因 対策 初心者, https://jp-seemore.com/web/4150/

52. Element: setHTMLUnsafe() method, https://developer.mozilla.org/en-US/docs/Web/API/Element/setHTMLUnsafe

53. Element: setHTML() method, https://developer.mozilla.org/en-US/docs/Web/API/Element/setHTML

54. Element: getHTML() method, https://developer.mozilla.org/en-US/docs/Web/API/Element/getHTML

55. ShadowRoot: setHTML() method, https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot/setHTML

56. HTML Living Standard, https://html.spec.whatwg.org/dev/

57. WHATWG Responsibility and Memo of Understanding, https://en.wikipedia.org/wiki/WHATWG

58. WHATWG Living Standards Evolution, https://whatwg.dev/

コメント

  1. とても勉強になりました。初心者向けにここまで丁寧にDOMを整理している記事は貴重だと思います。

    関連リソースとして、JavaScriptやDOMの理解確認・面接練習に使える FrontendAtlas も参考になるかもしれません。
    https://frontendatlas.com/

    ありがとうございました。

タイトルとURLをコピーしました