HTML文書をプログラミング言語でアクセスするためのモデルが Document Object Modelである。
以下のHTML文書片を考える。
<body> <p>今回は<em>三権分立</em>がテーマです。</p> <ul> <li>司法</li> <li>立法</li> <li>行政</li> </ul> <p>の3つが…</p> </body>
この文書には、以下のような要素の木構造ができている。
+--「今回は」 | +-[p]--+-[em]--「三権分立」 | | | +--「がテーマです。」 [body]--+ | +-[li]--「司法」 | | +-[ul]-+-[li]--「立法」 | | | +-[li]--「行政」 | | +-[p]--「の3つが…」
図: 要素の木
これと全く同じ木構造が、HTMLユーザエージェントに付随するスクリ プト言語のオブジェクト(複合的な値)として生成される。これを規定したものが DOM (Document Object Model)である。
JavaScriptでは、javascriptプログラムを読み込んだときのHTML文書の あらゆる要素が、JavaScript言語の HTMLElement(の派生) オブジェクトとして 生成されている。「図:要素の木」が示す構造の場合、最初のbody要素を 意味するオブジェクトにアクセスできれば、その子孫の全ての要素オブジェクト にアクセスできる。また、HTML要素に付けられた属性や、スタイルシートの 特性値も自在に取得/設定できる。
documentオブジェクトは、HTML文書全体の情報を保持する。 スタイルシートの操作で必要になるのは、 HTML文書中の特定の要素を探し出す方法で、 そのための関数には以下のものがある。
document.getElementsByTagName(ELEM)
HTML文書中から、ELEM で指定した要素を全て探し、 それらを配列にしたものを返す。
document.getElementById(ID)
HTML文書中から、ID と同一の id 属性を持つ 要素を返す。id属性は文書中で唯一の値を持たせることが前提であるので 同じid属性値が見付かった場合の挙動は定義されていない。
上記のいずれかの関数によって、ひとつの要素オブジェクトが見付かると その他の要素も見付けることができる。「図:要素の木」が示すように、 あらゆる要素は親、兄弟、子を持つ可能性がある。このような性質を持つものを 一般的にノードという。特定の要素をノードとみなし、木の 親兄弟を辿るいくつかの値が定義されている。
parentNode
親ノード
childNodes
全ての子ノードををおさめたリスト
firstChild
最初の子ノード
lastChild
最後の子ノード
previousSibling
ひとつ前の兄弟ノード
nextSibling
ひとつ次の兄弟ノード
最初の図の例でいえば、1つ目のp要素の、
parentNode
はbody要素
childNodes
は「今回は」から「がテーマです。」の全て
previousSibling
はnull(空っぽ)
nextSibling
はul要素
となる。
特定の要素を持つオブジェクトから、その要素に設定された属性には、
getAttribute/setAttribute
を介してアクセスできる。例えば、以下のようなHTML要素記述があったとする。
<p>鳥海山:<img src="chokai.jpg" alt="Mt.Chokai"
width="400" height="266"></p>
このうち、img要素に設定された width, height 属性を半分にするスクリプトを作成してみる。JavaScriptプログラムから このimg要素を探しやすいように、id属性を追加し、画像クリックによって 関数が起動するように onclick 属性を追加し、以下のように書き換えておく。
<p>鳥海山:<img src="chokai.jpg" alt="Mt.Chokai"
id="photo01" onclick="hanbun();" width="400" height="266"></p>
getAttribute/setAttribute
を利用JavaScriptプログラムファイル chokai1.js
を開き、hanbun()関数を以下のように作成する。
function hanbun() { chokai = document.getElementById("photo01"); w = chokai.getAttribute("width"); h = chokai.getAttribute("height"); chokai.setAttribute("width", w/2); chokai.setAttribute("height", h/2); }
このスクリプトをロードするようHTML文書に以下のscript要素を追加する。
<p>鳥海山:<img src="chokai.jpg" alt="Mt.Chokai"
id="photo01" onclick="hanbun();" width="400" height="266"></p>
<script type="text/javascript" src="chokai1.js">
</script>
作成例(文書のソースを見よ)
JavaScriptプログラムファイル chokai2.js
を開き、hanbun()関数を以下のように作成する。
function hanbun() { chokai = document.getElementById("photo01"); w = chokai.width; h = chokai.height; chokai.width = w/2; chokai.height = h/2; }
作成例(文書のソースを見よ)
属性値はHTML文書で明示的に定義されていない場合、取得できない場合があ る。スクリプトで操作したい場合はHTML文書中であらかじめ値を与えておく よう注意する。
要素オブジェクトに属するstyleオブジェクトを介してスタイルシートの プロパティがアクセスできる。特性名にハイフンが含まれるものは ハイフンを取って、次の文字を大文字にして結合する。たとえば、
<div id="foo" style="background-color: yellow"> ... </div>
というdiv要素の場合は、以下のJavaScriptで background-color 特性値が 取得できる。
x = getElementById("foo"); x.style.backgroundColor;
この変数に代入することで、特性値を変更することもできる。
以下の例は、マウスが入ると赤に、出ると黄色に戻る枠を作成するものであ る。
<html> <head><title>Red and Yellow</title> <style type="text/css"> <!-- div#box { width: 200px; height: 100px; background-color: yellow; } --> </style> </head> <body> <p>マウスを入れると赤、出すと黄色。</p> <div id="box" onmouseover="red();" onmouseout="yellow();"> </div> <script type="text/javascript" src="redyellow.js"> </script> </body> </html>
function red() { document.getElementById("box").style.backgroundColor = "red"; } function yellow() { document.getElementById("box").style.backgroundColor = "yellow"; }
定義例: redyellow.html
CSSの特性値の場合も属性のときと同様、HTML+CSS文書であらかじめ 値を設定していない特性値はスクリプトからは取得できない(nullが返る)。
文書とスタイルの分離という観点からは、CSSの特性値を操作する この方法が最も望ましい。