The DOM (Document Object Model) is a tree-like data structure created by the browser from your HTML. JavaScript uses this tree to find elements, update text and attributes, handle events, and reflect changes on the screen.
DOM(Document Object Model)は、ブラウザがHTMLを読み取って作る「画面の裏側のツリー(木構造)」です。JavaScriptはこのツリーを操作することで、画面の内容を変えたり、クリックなどのイベントを受け取ったりできます。
「HTMLは文字なのに、なぜJavaScriptで要素を探したり書き換えたりできるの?」という疑問は、DOM を“データ構造”として捉えるとスッと解決します。
DOM を「画面の裏側のツリー」として言葉で説明できるdocument / Element / Node の“ざっくり関係”が分かるquerySelector と addEventListener が、DOM上で何をしているか説明できるDOM って何?直感的には、HTMLを「部品の木」へ変換したものです。HTMLは元々“文字列”ですが、ブラウザはそれを読み取って「<div> の中に <p> があって…」という“親子関係のある部品”として組み立て直します。その結果できるのが DOM です。
<button> がここにある」「この要素のテキストはこれ」といった構造情報です。
見た目は主にCSSが担当し、ブラウザはDOMとCSSなどをもとに画面を描画します。
document からたどれる」ことが分かれば十分です。
覚え方:DOM は「HTMLを“木”にしたもの」。JavaScriptは「木の枝(要素)をつかんで変える」。
DOM は、Webプラットフォームで文書(HTML/XMLなど)をツリー構造のノードとして表し、スクリプトからアクセス・変更できるようにするためのモデルです。実務では「document から始まるノードツリー」と捉えるのが分かりやすいです。
document は「今見ているページの入口」document は、今のページ(文書)を表すオブジェクトです。
ここから document.body や querySelector などで、DOM上の要素へアクセスします。
Node は「ツリーの1点(要素・テキストなど)」Element)だけでなく、テキスト(Text)などもノードです。
実務で最初に意識すると効くのは「要素だけがツリーじゃない」という点です(混乱ポイントで扱います)。
Element は「タグに対応するノード」<div> や <button> のような“要素”に対応します。
クラスや属性(class / id / data-*)を持ち、見た目やイベントと強く関わります。
仕様の細部(どのインターフェースがどれを継承するか等)は、最初は完全理解しなくてOKです。まずは document → 要素を探す → 変更 → 画面に反映 の流れを押さえるのが優先です。
querySelector / getElementById などで要素を取得するaddEventListener でクリック等に反応するdocument です。
ただし、取得した要素(たとえば const box = document.querySelector(...))から、
その内部だけを探す(box.querySelector(...))こともできます。
これは「DOMをツリーとして扱っている」からできることです。
ここで止まりがち:querySelector で取れない時は「セレクタのミス」だけでなく「DOMがまだ作られていない(読み込み前)」ことがあります。対策は defer を使う、または DOMContentLoaded 後に実行する、のどちらかです。
DOM と「HTML文字列」は同じ?element.outerHTML で“HTMLっぽい文字列”が取れることもありますが、実体はDOMです。
<p>Hello</p> の Hello は「テキストノード」です。
この違いを知らないと、childNodes や firstChild で「変な空白がある」ように見えて混乱しがちです。
innerHTML は便利だから基本これで良い?textContent を優先するのが安全です。
DOM と CSS の役割が混ざるhidden、aria-expanded、class)で管理します。
DOMは「状態の置き場所」になりやすいので、どこに何の状態があるかを意識すると設計が安定します。
document.createElement で要素を作り、append で追加します。
小さなUIでも「どの要素を、どこに、どの順で追加するか」が分かっていると、バグが減ります。
addEventListener でイベントを登録します。
DOMにイベントが届く流れ(バブリングなど)を知ると、親要素でまとめて処理(イベント委譲)できるようになります。
これは大量の要素があるUIでとても効きます(補足で触れます)。
実務メモ:「DOMを触る」=「要素の見た目を直接変える」ではありません。実務では “状態をDOMに持たせて、CSSで見た目を切り替える” が定番です(例:クラスを付け替える)。
null に対して操作して落ちる(要素が取れていない)JavaScript
const button = document.querySelector("#save");
if (!button) {
// ここで止まりがち:要素が無い状態で操作して例外になる
return;
}
button.addEventListener("click", () => {
// ...
});
innerHTML でイベントが消える/状態が飛ぶinnerHTML は中身を作り直すため、既存の要素参照やイベントが失われます。
textContent、要素の追加なら createElement+append を基本にします。
DocumentFragment 等)か、まずデータを配列で整えてから、最後にまとめてDOMへ反映します。
ここはパフォーマンスの話なので、最初は「大量に触ると重くなることがある」くらいでOKです。
event.target(実際に押された要素)と、event.currentTarget(リスナーを付けた要素)を区別します。
注意:外部入力(フォーム、URL、APIレスポンス等)を innerHTML に入れるのは危険になり得ます。基本は textContent を使い、どうしてもHTMLを扱う場合は「入力の出どころ」と「安全な変換(サニタイズ)」を設計に含めます。
DOMは「3者の接点」です。HTMLが構造の元になり、CSSが見た目のルールを与え、JavaScriptが状態と操作を追加します。
<button> など)や属性(id、class、data-*)は、DOMを探す・意味を伝える・スタイルを当てるための手がかりになります。
コツ:「見た目のルールはCSS」「状態の切替はクラス」「必要な時だけDOMを触る」――この分担ができると、UIは壊れにくくなります。
DOMを知る目的は「書ける」ではなく「判断できる」です。ここでは、DOMを前提に“どこまでをDOM操作でやるか”を考える軸を作ります。
「触らない」は“禁止”ではなく、「設計の負担が増えやすい」サインです。
<div> を使うと、キーボード操作や支援技術への意味伝達が弱くなります。
DOMを理解するほど、「正しい要素を選ぶ」価値が上がります。
結論:DOMを前提に考えるとは、「画面を“部品の木”として捉え、どの部品にどんな状態と役割があるかを言語化してから実装する」ことです。
DOMは「ツリー」ですが、最初は“要素をつかんで変える”が分かれば十分です。次のデモは、querySelector で要素を取得し、textContent と classList を更新します。
デモ:メッセージを書き換える DOM操作
こんにちは。ここは DOM で書き換わります。
いま触っている要素:#domDemoMessage
この“簡略ツリー”は説明用です。実際のDOMにはもっと多くのノードがあります。
HTML
<p id="domDemoMessage">こんにちは。ここは DOM で書き換わります。</p>
<input type="text" id="domDemoInput">
<button type="button" id="domDemoApply">適用</button>
JavaScript
const message = document.querySelector("#domDemoMessage");
const input = document.querySelector("#domDemoInput");
const apply = document.querySelector("#domDemoApply");
apply.addEventListener("click", () => {
message.textContent = input.value.trim() || "(空です)";
});
ここで止まりがち:見た目を変えたい時に style を直接いじりすぎると、後からCSSの設計が崩れやすいです。まずは classList.add/remove でクラスを切り替える設計を検討してください。
DOM はどこに存在していますか?document からアクセスできます。
document と window はどう違いますか?document は「文書(ページ)」、window は「ブラウザのウィンドウ(環境)」の入口です。
DOMを触る入口は主に document で、画面サイズや履歴など“環境”は window 側に寄っています。
querySelector と getElementById はどちらを使えばいいですか?querySelector はCSSセレクタで書けるので統一しやすく、
getElementById は id がある場合に意図が明確で軽量なことが多いです。
迷ったら querySelector で揃えてOKです(ただし # の付け忘れに注意)。
textContent と innerHTML の使い分けは?textContent を使うのが安全です。
innerHTML は「HTMLとして解釈して挿入」するため、外部入力と混ぜると危険になり得ます。
HTMLを組み立てる必要がある場合は、要素を作って組み立てる(createElement)方が安全に寄せやすいです。
document。どの要素を基準に“ツリーをたどる”か決まっている?textContent で足りる?(innerHTML は慎重に)