JavaScript 入門 | ドキュメントオブジェクトモデル | ノードへのアクセス

ノードへのアクセス

HTML 文書で HTML DOM ノードへアクセスする方法は次のとおりである。

  1. getElementsByTagName() メソッドを利用する方法
  2. ノード間の関係を利用してアクセスする方法

getElementsByTagName() メソッドを利用する方法

getElementsByTagName() メソッドは、特定のタグ名を持つすべての要素をノードリストの形で返す。
したがって、このメソッドが返すノードリストを利用すると、目的のノードへアクセスできる。

HTML DOM でノード間の関係は、次のようなプロパティで定義される。

  1. parentNode: 親ノード
  2. childNodes: 子ノードリスト
  3. firstChild: 最初の子ノード
  4. lastChild: 最後の子ノード
  5. nextSibling: 次の兄弟ノード
  6. previousSibling: 前の兄弟ノード

上記のようなプロパティを利用すると、目的のノードへ簡単にアクセスできる。

ノードに関する情報

ノードに関する情報は、次のようなプロパティを通じてアクセスできる。

  1. nodeName
  2. nodeValue
  3. nodeType

これらのプロパティは、特別な別のインターフェースを利用しなくても、そのノードの情報へ直接アクセスする方法を提供する。

nodeName

nodeName プロパティはノード固有の名前を保存するため、変更できない読み取り専用プロパティである。

要素ノードの nodeName プロパティは、常にその HTML 要素のタグ名を大文字で保存する。

ノード プロパティ値
文書ノード #document
要素ノード タグ名 (英字の大文字)
属性ノード 属性名
テキストノード #text
// HTML 文書のすべての子ノードのうち、2番目のノードの名前を選択する。
document.getElementById("document").innerHTML = document.childNodes[1].nodeName;           // HTML

// html ノードのすべての子ノードのうち、最初のノードの名前を選択する。
document.getElementById("html").innerHTML = document.childNodes[1].childNodes[0].nodeName; // HEAD

上の例で、HTML 文書の最初の子ノードは <!DOCTYPE html> であり、2番目の子ノードは <html> である。 また、<html> ノードの最初の子ノードは <head> であり、3番目の子ノードは <body> である。

nodeValue

nodeValue プロパティはノードの値を保存する。

ノード プロパティ値
要素ノード undefined
属性ノード その属性の属性値
テキストノード そのテキスト文字列
// id が "heading" の要素の最初の子ノードのノード値を選択する。
var headingText = document.getElementById("heading").firstChild.nodeValue;

document.getElementById("text1").innerHTML = headingText;
document.getElementById("text1").firstChild.nodeValue = headingText;

これまでは innerHTML プロパティを使用して、HTML 要素の内容へ簡単にアクセスしたり、内容を変更したりできた。
この innerHTML プロパティの代わりに firstChild.nodeValue を使用しても、同じ結果を得ることができる。

nodeType

nodeType プロパティはノード固有の型を保存するため、変更できない読み取り専用プロパティである。

代表的な HTML ノード別の nodeType プロパティ値は次のとおりである。

ノード プロパティ値
要素ノード 1
属性ノード 2
テキストノード 3
コメントノード 8
文書ノード 9
// id が "heading" の要素の最初の子ノードの型を選択する。
var headingType = document.getElementById("heading").firstChild.nodeType;

document.getElementById("head").innerHTML = headingType;           // 3
document.getElementById("document").innerHTML = document.nodeType; // 9

空のテキストノードの処理

現在、ほとんどの主要 Web ブラウザーは W3C DOM モデルをサポートしているが、処理方式には多少の違いがある。
その中でももっとも大きな違いは、空白と改行を処理する方式である。

Firefox やその他のブラウザーは、空白や改行をテキストノードとして扱う。
しかし、Internet Explorer は空白や改行をテキストノードとして扱わない。

したがって、子ノードや兄弟ノードを利用して目的のノードへアクセスしようとすると、ブラウザー間で違いが発生する。
この違いをなくすもっとも簡単な方法は、nodeType プロパティを使用して選択された要素の型を検査することである。

var lastNode;
function findLastChild(parentNode) {
    lastNode = parentNode.lastChild;
    while (lastNode.nodeType != 1) {
        lastNode = lastNode.previousSibling;
    }
}
function printLastChild() {
    var parentNode = document.getElementById("parentNode");
    findLastChild(parentNode);
    document.getElementById("nodename").innerHTML = lastNode.nodeName;
}

上の例では、最後の子ノードを見つけた後、見つけたノードの型が要素ノードでなければ、その前のノードを再び検査する。
この方式を使用すると、すべてのブラウザーで最後の子ノードとして同じ要素ノードを選択できる。