【ITニュース解説】Day 10–11 DOM Manipulation interview prep pack
2025年09月11日に「Dev.to」が公開したITニュース「Day 10–11 DOM Manipulation interview prep pack」について初心者にもわかりやすく解説しています。
ITニュース概要
DOMとは何か、要素の取得・操作、innerTextとinnerHTML、イベントリスナー、イベント伝播、イベントデリゲーションなど、Web開発の基礎を解説する記事。実践的なコーディング課題やTo-Doリスト作成を通じ、動的なWebページ開発スキルを習得できる。
ITニュース解説
ウェブページは、ブラウザによって表示される際、HTMLやXMLドキュメントの構造を表現するオブジェクトの集合体へと変換される。これがDocument Object Model、通称DOMである。ブラウザがHTMLファイルを読み込むと、それを解析し、ツリー構造を持つDOMをメモリ上に構築する。このツリー構造の各ノードは、HTMLの要素、属性、テキストなどに対応しており、JavaScriptなどのスクリプトからこれらのノードにアクセスし、内容や見た目をプログラム的に変更できるようになる。
DOMの要素を操作するためには、まず対象の要素を特定する必要がある。そのための主要なメソッドがいくつか存在する。getElementByIdは、HTML要素に割り当てられた一意のIDを使って特定の要素を一つだけ取得する最も直接的な方法だ。IDはドキュメント内で重複しないため、確実に目的の要素にアクセスできる。getElementsByClassNameは、指定されたクラス名を持つすべての要素をリスト(HTMLCollection)として取得する。複数の要素をまとめて操作したい場合に便利だ。querySelectorは、CSSセレクタ(例: #myId, .myClass, pなど)を使って最初に見つかった要素を一つだけ取得する。より柔軟なセレクタ指定が可能だが、複数の要素があっても最初のものしか返さない。querySelectorAllは、CSSセレクタに一致するすべての要素をリスト(NodeList)として取得する。これらのメソッドは、特定の要素を見つけ出し、操作を開始するための入り口となる重要な機能である。
要素のコンテンツを操作する際には、innerText、textContent、innerHTMLという三つのプロパティがよく使われる。innerTextは、ブラウザが実際にレンダリングする(画面に表示される)テキストコンテンツを取得または設定する。CSSによる非表示要素や空白文字の扱いが反映されるため、ユーザーに見える通りのテキストを扱いたい場合に適している。textContentは、要素とそのすべての子孫ノードに含まれるテキストコンテンツを、書式を問わず取得または設定する。CSSの影響を受けず、HTMLタグをすべて無視して純粋なテキストを取り出すため、内部的なテキストデータを取り出したい場合に有効だ。innerHTMLは、要素のHTMLコンテンツ全体を取得または設定する。これを使うと、HTMLタグを含んだ文字列を要素の中に挿入できるため、新しい要素をまとめて追加したり、既存の構造を大きく変更したりする際に非常に強力だ。ただし、任意のHTMLを挿入するため、悪意のあるスクリプトの挿入(クロスサイトスクリプティング)といったセキュリティリスクに注意が必要となる。
ウェブページにおけるユーザーとのインタラクションを実現するのがイベントリスナーだ。イベントリスナーは、ウェブページ上でのユーザーのアクション(クリック、キー入力など)や、ブラウザの動作(ページの読み込み完了など)を監視し、特定のイベントが発生したときに指定された関数(イベントハンドラ)を実行するための仕組みである。イベントハンドラを設定するには、addEventListenerメソッドを使用するのが現代のベストプラクティスとされている。addEventListenerは、一つの要素に対して複数のイベントハンドラを登録できる柔軟性があり、イベントの発生段階(バブリングまたはキャプチャリング)を指定できる。これにより、複雑なイベント処理も適切に記述できる。一方、HTMLのonclick属性のようなインラインハンドラは、一つの要素に一つのイベントしか登録できず、HTMLとJavaScriptが混在するため、コードの分離が難しく、保守性が低下する傾向がある。
JavaScriptで値の比較を行う際には、==(等価演算子)と===(厳密等価演算子)の違いを理解することが重要だ。==は、値が等しいかを比較する際に、必要に応じて型の自動変換(型変換)を行う。例えば、数値の5と文字列の"5"を比較するとtrueとなる。一方、===は、値だけでなく型も等しいかを比較するため、型変換を行わない。そのため、5 === "5"はfalseとなる。予測不能なバグを防ぎ、より厳密な比較を行うため、===の使用が推奨されることが多い。
DOMイベントの伝播には、イベントバブリングとイベントキャプチャリングという二つのフェーズがある。イベントバブリングは、要素で発生したイベントが、その親要素、さらにその親へとDOMツリーを上に伝わっていく(泡のように浮き上がる)現象を指す。例えば、子要素をクリックすると、そのクリックイベントは子要素だけでなく、親要素やそのさらに親要素でも捕捉される可能性がある。イベントキャプチャリングは、イベントがDOMツリーのルート(windowやdocument)からターゲット要素へ向かって下に伝わっていく現象だ。イベントリスナーに第三引数としてtrueを指定することで、キャプチャリングフェーズでイベントを捕捉できる。イベントの伝播を途中で停止させたい場合は、イベントオブジェクトのstopPropagation()メソッドを使用する。これにより、それ以上親要素や子要素にイベントが伝わらないようにできるため、特定の要素でのみイベントを処理し、それ以外の要素に影響を与えたくない場合に有効だ。
多数の類似する子要素にイベントを設定する際に役立つのがイベントデリゲーションである。これは、多数の子要素にそれぞれイベントリスナーを設定するのではなく、それらの親要素に一つのイベントリスナーを設定し、子要素で発生したイベントを親要素でまとめて処理する手法だ。これにより、メモリ使用量を抑えられ、後から動的に追加された子要素に対しても自動的にイベント処理が適用されるため、効率的で柔軟なコードが実現できる。特に、リストアイテムのように多数の要素が頻繁に追加・削除される場合に非常に有用となる。この時、イベントオブジェクトにはtargetとcurrentTargetという二つの重要なプロパティがある。event.targetは、実際にイベントが最初に発生した要素、つまりイベントの発生源を指す。一方、event.currentTargetは、イベントリスナーがアタッチされている要素、つまり現在イベントを処理している要素を指す。イベントデリゲーションを使用する際に、この二つの違いを理解することは、どの要素が操作されたかを正確に把握するために不可欠となる。
ウェブページの内容をユーザーの操作やアプリケーションの状態に応じて動的に変更することは、現代のウェブ開発において基本となる。新しい要素をDOMに追加するには、まずdocument.createElement()を使って新しいHTML要素(例: <div>, <p>, <li>など)をメモリ上に作成する。その後、その要素にテキストコンテンツや属性を設定し、appendChild()やinsertBefore()などのメソッドを使って、既存のDOMツリー内の適切な親要素の子として追加する。これにより、ページの内容をJavaScriptで柔軟に変更・拡張できる。要素を削除する際には、removeChildとremove()という二つの方法がある。removeChildは、親要素から特定の子要素を削除するメソッドで、親要素を指定し、その子要素を引数として渡す必要がある。例えば、parentElement.removeChild(childElement)のように使う。一方、remove()は、特定の要素自身をDOMツリーから削除するメソッドで、対象の要素から直接呼び出すことができる。例えば、element.remove()のように使う。remove()は比較的新しいメソッドで、より直感的に使えるため、今日では推奨されることが多い。
これらのDOM操作やイベント処理の概念は、実際のプログラミング課題を通してさらに深く理解できる。例えば、getElementByIdを使って二つの要素間でテキストを交換したり、querySelectorでボタンクリックに応じてページの背景色を変更したり、addEventListenerと組み合わせることでテキストエリアの残り文字数をリアルタイムで表示するライブ文字カウンターを実装したりできる。また、ネストされた要素でクリックイベントを設定し、stopPropagation()を用いてイベントのバブリングを途中で停止させることで、イベント伝播のメカニズムを体感できる。ボタンクリックでリストアイテムを動的に追加する機能は、createElementやappendChildを使った要素の動的生成の良い例だ。
これらの知識を総合的に活用する「インタラクティブなTo-Doリスト」は、実用的なウェブアプリケーション開発の良い練習となる。このプロジェクトでは、新しいタスクを動的に追加したり、追加されたタスクをクリックで完了マークをつけたり、イベントデリゲーションを利用してタスクを効率的に削除したりする機能が求められる。また、完了したタスクには打ち消し線を引くなど、CSSを用いた動的なスタイリングも含まれる。システムエンジニアにとって、ユーザーインターフェースを動的に操作し、ユーザーの操作に反応するウェブページを作成する能力は不可欠であり、これまでに学んだDOM操作、イベント処理、イベントデリゲーションといった重要な概念は、ウェブ開発の基本的なスキルを形成する。