生徒
DOMやDOM要素というのがよくわかりません
DOMやDOM要素、ノードについて説明します
目次
JavaScriptではHTMLをDOMとして扱う
JavaScriptではWEBページをDOMとして扱うので、WEBページの操作や表示の変更には、DOMを理解する必要があります。
この記事では、DOMツリーやDOM要素について説明します。
DOMに付いて
DOM(Document Object Model)とは、HTMLのようなマークアップ言語を、ツリー構造のオブジェクトとして表現したものです。
DOMはAPIを持っていて、JavaScriptなどのプログラム言語からAPIでアクセスしてデータを取得できます。
DOMツリーの主な構成要素
DOMのツリー構造の主な構成要素は以下になります。
- Document(ドキュメント) ・・・ WEBページ全体
- Node(ノード) ・・・ ツリーの各要素に共通する抽象クラス
- Element(エレメント) ・・・ ツリーの各要素に共通する基本クラス
Document
Document
は、ブラウザに読み込まれているWEBページを表します。
WEBページ内の要素には、Document
を通してアクセスします。
JavaScript
// Documentのプロパティを取得
const url = document.location;
// WEBページ内の要素を取得
const paragraphs = document.querySelectorAll('p')
Node
Node
はDOMツリー内のすべての要素の基底となる抽象クラスです。
Document
やElement
、コメントなど種類の違いはnodeType
プロパティで定義されています。
Node: nodeType プロパティ – Web API | MDN
nodeType は Node インターフェイスの読み取り専用プロパティであり、整数値でこのノードが何であるかを識別します。これは様々なノードの種類、例えば elements、text、co…
すべての要素がNode
クラスを継承しているので、共通してNode
クラスの以下のようなプロパティや関数を持っています。
関数 | 説明 |
---|---|
childNodes | すべての子孫のリストを返します。 |
appendChild() | 引数を現在のノードの最後の子として追加します。 |
contains() | 指定したノードの子孫であるか否かを返します。 |
JavaScript
// DocumentからDOMエレメントを取得する
const list = document.getElementsByTagName('ul');
// Domエレメントの最初の子Nodeを取得する
const firstNode = list[0].firstChild.nodeName;
Element
Element
は、Node
を具体化した、すべてのオブジェクトが継承する基底クラスです。
Element
は以下のようなプロパティや関数、イベントを持っていて、継承したすべての要素でも使用できます。
関数 | 説明 |
---|---|
className | 要素のクラス名を返します。 |
querySelector() | 指定したセレクターに一致する最初の Node を返します。 |
keydown | キーが押されたときに発行されるイベント。 |
JavaScript
// DOMエレメントを取得する
const element = document.getElementsByTagName("p");
const className = element[0].className;
EventTarget
イベントを受け取ったり、イベントを定義できるすべての要素が持つインターフェイスです。
DocumentやWEBページ内のすべての要素は、EventTargetインターフェイスを持ちます。
関数 | 説明 |
---|---|
addEventListener() | イベントを定義。 |
removeEventListener() | イベントを削除。 |
dispatchEvent() | イベントを起こす。 |
JavaScript
// EventTargetを作成する
const events = new EventTarget()
// イベントリスナーを登録する
const eventListener = ({ type, detail }) => alert(detail);
events.addEventListener("カスタム", eventListener);
// イベントを送信する
events.dispatchEvent(new CustomEvent('カスタム', { detail: 'メッセージ' }));