このドキュメントの前半を、『DOMによるエレメントの発見』、後半を『DOMにより、エレメントを変化(へんげ)させる』というコンテンツで新しく書き直しました。
DOM4で追加されたインターフェイスに関しても記載しています。ぜひご覧ください。
DOMとは、W3Cによって策定された、プログラムからxml(html)ドキュメントに、アクセスするためのインターフェイスです。このインターフェイスは、特定のベンダーに依存することはありません。また、プログラム言語から、独立した形で仕様が決められているため、どのような言語にでも実装できるようになっています。
DOMが、プログラム言語からは、独立した形で仕様が決められていると書きましたが、DOMの仕様には、JavaとECMAScriptのAPIが、付録という形で載っています(ECMAScriptとは、JavaScriptの現時点の標準仕様のことで、一般的なWebブラウザはこの仕様に則って、JavaScriptを実装しています)。
2007年現在、一般的に使用されているWebブラウザのほとんどが、実用レベルでサポートしているので、互換性の不安無く(無くはないか)DOMを使える環境が整いつつあります。
DOMの守備範囲は、あくまでもxml(html)へのアクセスです。特定のIDが設定されているエレメント(要するにタグのことです)を取得したり、エレメントの表示スタイルを変更したりすることは、仕様の範囲内ですが、新しいウィンドウを開いたり、マウスカーソルを移動したりといった、xml(html)ドキュメントへのアクセス以外のことは、仕様の範囲外となります。
JavaScriptでDOMを使う場合、何はともあれdocment
オブジェクトを取得する必要があります。但し、DOMの仕様では、docment
オブジェクトを取得する方法は、定められてはいません。これは各実装者(例えば、Webブラウザの作成者)が、勝手に決めることを意味しています。幸いにも、htmlの中に記述またはリンクされたJavaScriptでは、docment
オブジェクトは、すでに用意されているので、特に取得する必要はありません。
以下の例では、ドキュメントに、"Hello World"と表示します。
document.writeln('Hello World');
DOMで何かをする場合、対象となる要素を見つけなければなりません。このためのメソッドが、docment
オブジェクトにはいくつか用意されています。代表的な物を以下にあげます。
Element getElementById(in DOMString elementId); NodeList getElementsByName(in DOMString elementName); NodeList getElementsByTagName(in DOMString tagname);
getElementById
は、ドキュメント内から、特定の id が設定してあるエレメントを探します。html4 の仕様上、id はドキュメント内でユニークであることから、このメソッドは、単一のエレメントを返します。
getElementsByName
は、ドキュメント内から、特定の name が設定してあるエレメントを探します。html4 の仕様上、複数のタグに同一の name が設定できることから、このメソッドは、複数のエレメントを含むリスト(配列)を返します。
getElementsByTagName
は、ドキュメント内から、特定の名前のタグ探します。このメソッドは、複数のエレメントを含むリスト(配列)を返します。
<!-- 1行目1列目 --> <input type="text" name="column0" size="20" id="row0column0"> <!-- 1行目2列目 --> <input type="text" name="column1" size="3" id="row0column1"> <!-- 1行目3列目 --> <input type="text" name="column2" size="10" id="row0column2"><br> <!-- 2行目1列目 --> <input type="text" name="column0" size="20" id="row1column0"> <!-- 2行目2列目 --> <input type="text" name="column1" size="3" id="row1column1"> <!-- 2行目3列目 --> <input type="text" name="column2" size="10" id="row1column2"><br> <!-- 3行目1列目 --> <input type="text" name="column0" size="20" id="row2column0"> <!-- 3行目2列目 --> <input type="text" name="column1" size="3" id="row2column1"> <!-- 3行目3列目 --> <input type="text" name="column2" size="10" id="row2column2"><br> <!-- 4行目1列目 --> <input type="text" name="column0" size="20" id="row3column0"> <!-- 4行目2列目 --> <input type="text" name="column1" size="3" id="row3column1"> <!-- 4行目3列目 --> <input type="text" name="column2" size="10" id="row3column2"><br>
上記のようなhtmlドキュメントに対し、下記のコードを実行すると、item
には、2行目3列目のinput
エレメントが格納されます。
var item = document.getElementById('row1column2');
同様に、下記のコードを実行すると、items
には、2列目のinput
エレメントが4つ格納されます。
var items = document.getElementsByName('column1');
下記のコードの場合は、items
には、全てのinput
エレメントが格納されます。
var items = document.getElementsByTagName('input');
エレメントさえ見つけてしまえば、後は好きなように料理できます。サイズ・色・表示/非表示なども、簡単に変更できます。そう、スタイルを変えてしまえば良いのです。
下記の例では、name というIDを持ったエレメントの背景を、赤に変更します。
document.getElementById('id').style.backgroundColor = 'red';
変更したスタイルを元に戻すには、次のようにします。但し、html上でインラインスタイルが指定してある場合、それが上書きされてしまうので、正しく元に戻らない可能性もあります。DOMで処理したいドキュメントには、インラインスタイルを使わない方が、幸せになれます(笑)。
document.getElementById('id').style.backgroundColor = '';
エレメントオブジェクトのstyle
属性は、"DOM Level 2 Style Specification" で定義された、CSSStyleDeclaration
オブジェクトです。アプリケーションからは、このオブジェクトを通して、各エレメントの、インラインスタイルにアクセスすることができます。
CSSStyleDeclaration
オブジェクトからアクセスできるスタイルは、CSS2Properties
に定義されている項目のうち、該当エレメントに設定可能なものだけです。スタイルを設定できないエレメント(例えばtitle
エレメント)のスタイルを変更したり、CSS2Properties
に定義されていない項目を変更しようとすると、エラーになります。
ご参考までに、CSS2Properties
のIDL定義...(w3cのサイトへのリンクです。)
document.getElementById('id').style.display = 'none';
document.getElementById('id').style.width = '4em'; document.getElementById('id').style.height = '20px';
document.getElementById('id').style.cursor = 'wait';
対象エレメントのposition
(ポジション)に、absolute
を指定する必要があります。
document.getElementById('id').style.top = '100px';