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

ノードリスト

ノードリストは、getElementsByTagName()メソッドやchildNodesプロパティの値として返されるオブジェクトである。このオブジェクトは、HTML文書と同じ順序で、文書内のすべてのノードをリスト形式で保存している。

リスト内の各ノードには、0から始まるインデックスを使ってアクセスできる。

// idが"list"である要素のすべての子ノードを選択する。
var listItems = document.getElementById("list").childNodes;
// 子ノードのうち最初のli要素の内容を変更する。
listItems[1].firstChild.nodeValue = "HTML要素の内容を変更しました!";

上の例では、子ノードのうち最初の<li>要素を選択するとき、インデックスとして0ではなく1を使用している。その理由は、HTML DOMでは各要素ノードの後に別のテキストノードが存在するためである。したがって、idが"list"である要素の子ノードリストの最初のノードには、その要素の後に存在するテキストノードが保存される。

次の例は、このような要素ノードの間に存在するテキストノードを確認する例である。

// idが"list"である要素のすべての子ノードを選択する。
var listItems = document.getElementById("list").childNodes;
 
// 子ノードのうち最初のノードの値を出力する。
document.write(listItems[0].nodeValue + "<br>");
// 子ノードのうち2番目のノードの、最初の子ノードの値を出力する。
document.write(listItems[1].firstChild.nodeValue + "<br>");
// 子ノードのうち3番目のノードの値を出力する。
document.write(listItems[2].nodeValue);

上の例は、各要素ノードの後に別のテキストノードが存在することを示している。したがって、ノードリストにインデックスでアクセスするときは、このようなテキストノードの存在を必ず意識する必要がある。

ノードリストオブジェクトは、リストにノードが追加されたり削除されたりすると、自分自身の状態情報を更新する。したがって、このオブジェクトのlengthプロパティの値は、常にノードリストが保持しているノードの総数を表す。

var listItems = document.getElementsByTagName("li");              // すべての<li>要素を選択する。
document.getElementById("text").innerHTML = 
"このノードリストの長さは" + listItems.length + "個です。<br>"; // すべての子ノードの数を返す。
function changeTextColor() {
    for (var i = 0; i < listItems.length; i++) {
        listItems[i].style.color = "orange";                      // すべての子ノードの文字色を変更する。
    }
}