JavaScript HTML DOM ナビゲーション

HTML DOMを通じて、ノードツリーをナビゲートするためにノード関係を使用できます

DOM ノード

W3C HTML DOM標準に基づいて、HTMLドキュメント内のすべてのものはノードとされています:

  • 全体のドキュメントはドキュメントノード
  • 各HTML要素は要素ノード
  • HTML要素内のテキストはテキストノード
  • 各HTML属性は属性ノード
  • すべてのコメントはコメントノード
DOM HTML ツリー

HTML DOMをもちまして、ノードツリーのすべてのノードはJavaScriptでアクセスできます

新しいノードを作成し、すべてのノードを編集および削除することができます

ノード関係

ノードツリーのノードは互いに関了一定的階層関係があります

  • 用語(親、子、同胞、parent、childおよびsibling)はこれらの関係を説明するために使用されます
  • ノードツリーでは、最上位のノードがルート(ルートノード)と呼ばれます
  • 各ノードは親ノードを持っていますが、ルート(ルートノードは親を持っていません)を除きます
  • ノードは一定の数の子を持つことができます
  • 同胞(兄弟または姉妹)とは同じ親を持つノードのこと
<html>
   <head>
       <title>DOM ガイド</title>
   </head>
  <body>
       <h1>DOM 初級講座</h1>
       <p>Hello world!</p>
   </body>
</html> 
DOM HTML ツリー

以上の HTML から以下の情報を読み取ることができます:

  • <html> はルートノード
  • <html> は親を持っていない
  • <html> は <head> と <body> の親
  • <head> は <html> の最初の子
  • <body>は<html>の最後の子です

同時に:

  • <head>には子が一つあります:<title>
  • <title>には子が一つあります(テキストノード):「DOM 教程」
  • <body>には二つの子があります:<h1>と<p>
  • <h1>には子が一つあります:「DOM 第一課」
  • <p>には子が一つあります:「Hello world!」
  • <h1>と<p>は同胞です

ノード間のナビゲーション

JavaScriptを使用して、以下のノード属性を通じてノード間をナビゲートできます:

  • parentNode
  • childNodes[nodenumber]
  • firstChild
  • lastChild
  • nextSibling
  • previousSibling

子ノードとノード値

DOM処理でよくある間違いは、要素ノードにテキストが含まれていると考えるところです。

例:

<title id="demo">DOM 教程</title>

(上記の例の)要素ノード <title> 含まれていませんテキストを含んでいます。

それは「DOM 教程」という値を持つテキストノードを通じて取得できます。

テキストノードの値は、ノードの innerHTML 属性を使用してアクセスします:

var myTitle = document.getElementById("demo").innerHTML;

innerHTML 属性にアクセスすることは、最初の子ノードにアクセスすることに等しいです: nodeValue

var myTitle = document.getElementById("demo").firstChild.nodeValue;

また、以下のように最初の子ノードにアクセスできます:

var myTitle = document.getElementById("demo").childNodes[0].nodeValue;

以下の三つの例で取得します <h1> 要素のテキストをコピーして <p> 要素内:

例 1

<html>
<body>
<h1 id="id01">私の最初のページ</h1>
<p id="id02">こんにちは!</p>
<script>
 document.getElementById("id02").innerHTML  = document.getElementById("id01").innerHTML;
</script>
</body>
</html>

自分で試してみましょう

例 2

<html>
<body>
<h1 id="id01">私の最初のページ</h1>
<p id="id02">こんにちは!</p>
<script>
 document.getElementById("id02").innerHTML = document.getElementById("id01").firstChild.nodeValue;
</script>
</body>
</html>

自分で試してみましょう

例 3

<html>
<body>
<h1 id="id01">私の最初のページ</h1>
<p id="id02">こんにちは!</p>
<script>
 document.getElementById("id02").innerHTML = document.getElementById("id01").childNodes[0].nodeValue;
</script>
</body>
</html>

自分で試してみましょう

InnerHTML

このチュートリアルでは、以下を使用します: innerHTML HTML 要素の内容を取得します。

ただし、上記の他の方法を学ぶことで、DOM の木構造とナビゲーションを理解するのに役立ちます。

DOM のルートノード

完全なドキュメントにアクセスするために、2つの特別な属性があります:

  • document.body - ドキュメントの body
  • document.documentElement - 完全なドキュメント

<html>
<body>
<p>Hello World!</p>
<div>
<p>DOM は非常に便利です!</p>
<p><b>document.body</b> 属性のデモンストレーションです。</p>
</div>
<script>
 alert(document.body.innerHTML);
</script>
</body>
</html>

自分で試してみましょう

<html>
<body>
<p>Hello World!</p>
<div>
<p>DOM は非常に便利です!</p>
<p><b>document.documentElement</b> 属性のデモンストレーションです。</p>
</div>
<script>
alert(document.documentElement.innerHTML);
</script>
</body>
</html>

自分で試してみましょう

nodeName 属性

nodeName 属性はノードの名前を定義します。

  • nodeName は読み取り専用です
  • 要素ノードの nodeName はタグ名と同じです
  • 属性ノードの nodeName は属性名です
  • テキストノードの nodeName は常に #text です
  • ドキュメントノードの nodeName は常に #document です

<h1 id="id01">私の最初のウェブページ</h1>
<p id="id02">こんにちは!</p>
<script>
document.getElementById("id02").innerHTML = document.getElementById("id01").nodeName;
</script>

自分で試してみましょう

注:nodeName は常に HTML 要素の大文字のタグ名を含みます。

nodeValue 属性

nodeValue 属性はノードの値を定義します。

  • 要素ノードの nodeValue は undefined です
  • テキストノードの nodeValue はテキストです
  • 属性ノードの nodeValue は属性値です

nodeType 属性

nodeType 属性はノードのタイプを返します。nodeType 読み取り専用です。

<h1 id="id01">私の最初のウェブページ</h1>
<p id="id02">こんにちは!</p>
<script>
document.getElementById("id02").innerHTML = document.getElementById("id01").nodeType;
</script>

自分で試してみましょう

もっとも重要な nodeType 属性は:

ノード タイプ
ELEMENT_NODE 1 <h1 class="heading">W3School</h1>
ATTRIBUTE_NODE 2 class = "heading" (廃止)
TEXT_NODE 3 W3School
COMMENT_NODE 8 <!-- これはコメント -->
DOCUMENT_NODE 9 HTML ドキュメント自体(<html>の親)
DOCUMENT_TYPE_NODE 10 <!DOCTYPE html>

Type 2 は HTML DOM で廃止されました。XML DOM では廃止されていません。