「JavaScript/DOM」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
getElementsByTagName()が返すのはリストではなくHTMLCollection。innerHTMLはメソッドではなくプロパティ。ほか
Ef3 (トーク | 投稿記録)
DOM XMLcore の拡張HTMLモジュールの事を表している記述から HTML5の一部 DOM ECMAScript API に緩やかに編集。実際HTML5のXML構文は、この本に見つけることが出来ない。
11 行
</head>
<body>
<div id="stdoutoutput"></div>
<script type="text/javascript">
var stdoutoutput = document.getElementById("stdoutoutput");
stdoutoutput.innerHTML = "Hello, world!";
</script>
</body>
22 行
このHTMLドキュメントをJavaScriptに対応したウェブブラウザで表示すると、ウェブページ上に "Hello, world!" という文字列が表示されます。<code>script</code>要素の中に書かれているJavaScriptプログラムのソースコードに注目してください。
 
<code>document.getElementById</code>メソッドはDOMの一部で、HTMLドキュメントから指定したIDを持つ要素を抽出します。ここでは "stdoutoutput" というIDを持つ要素、すなわち<code><nowiki><div id="stdoutoutput"></div></nowiki></code>という<code>div</code>要素を参照し、要素オブジェクトを<code>stdoutoutput</code>という変数に代入しています。
 
<code>stdoutoutput.innerHTML</code>プロパティを使用すると<code>div</code>要素の中身を取得したり、設定したりすることができます。ここでは<code>stdoutoutput.innerHTML</code>に <code>"Hello, world!"</code> という文字列を代入しているので、<code>div</code>要素の中身は "Hello, world!" という文字列になります。
 
== 動的なWebページの操作 ==
34 行
=== Document Object Model の解説 ===
 
Document Object Model (以下、DOM)とは、HTML文書やXML文書を読み込み・加工・操作するためオブジェクトデータ構造モデルで表現するこ、それを扱う方法を規格化したもので、XMLから派生したXHTML文章をスクリプト(ブプログウザ上では)'''HTMLも'''そのムから操作の対象するこなっていを実現するインターフェースである。
 
黎明期はJavaで実装・規格化されたため、XMLを扱うならJava一択という認識があった時期もあったが、現在ではほとんどの言語でDOMのプログラムインターフェースが整備されておりどの言語を選んだとしてもHTML文書やXML文書を扱えるようになっている(代表的な言語でDOMが標準でバンドルされていないものはRubyくらいであるが、こちらはREXMLという、よりリッチなライブラリを積んでいる)。
 
DOMは、基本的にはオブジェクト指向的な扱いを考えながらも、Java以外にも多くの言語で動作することを期待して規格化されており、文法的には堅くやや面倒くさい記述法をしているが、Webブラウザ側でHTML文書やXML文書を扱うための、ほぼ唯一の方法なので慣れる様努力して欲しい。
 
なお、DOMは現在では主流のブラウザほとんどで利用が出来るが、古いブラウザに関しては動かないものが多くある事を注意しておく(例としてはMicrosoftのInternetExplolerでは5.0以降で対応している)。
44 行
=== サンプル ===
 
HTML文書やXML文書は、文書をタグ要素で囲い込んでいるが、タグは必ず入れ子になるように書かれないといけないため必然的に囲っているタグと囲われているタグとの間に親子関係がある。
そして、複数のタグ要素を子として取ることが出来るため、タグ要素はツリー状に整理することが出来る。
DOMとはXML文書がツリー構造になる事を強く意識して作成されているライブラリ群である。
 
DOMは内部の動作原理が最初は想像をしにくいライブラリであるので、これを習得する際には実際にHTML文書やXML文書を読み込んで、それを操作しながら、動作とプログラムとの対応関係を頭の中に焼き付けてしまうのが一番良い方法だと思われる。
 
まずは、次のサンプルを打ち込んでほしい。
<syntaxhighlight lang="html5">
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>DOMでのデータ取り出しテスト</title>
</head>
<body>
<div>
<p>DOM TEST</p>
</div>
<script>
alert(document.getElementsByTagName("body").item(0).getElementsByTagName("p").item(0).firstChild.nodeValue);
<!--
alert(document.getElementsByTagName("body").item(0).getElementsByTagName("p").item(0).firstChild.nodeValue);
//-->
</script>
</body>
</html>
</syntaxhighlight>
 
この文書では、(x)htmlHTML文書中のbodyタグ内部に、divタグが埋め込まれており、さらにその中にpタグ。その中にテキスト文書が埋め込まれている。
ここから「DOM TEST」の文字列を読み出したい場合には、サンプルコードの様に記述をすればよい。
 
何故この様にするのかを逐次解説していく。
まず最初のdocumentを解説する。
documentはDocumentインターフェイスのオブジェクトで、特別に宣言を行わなくても存在し、
これはwebページでの文書本体を示す参照であるが、ここにはXML文書の一番上の要素。つまり、(x)html文書ではhtml要素が格納されている。
これにはwebページでのhtml要素をrootとする木構造として文書本体が格納されている。
そのため、展開された文書の本体からそのツリーの枝葉に当たる要素を順番に手繰ってゆく。
文書への操作は、ツリーの枝葉に当たる要素に降下することで行われる。
html要素の下にはhead要素とbody要素があるので、まずbody要素を取得するためにgetElementsByTagNameメソッドでbodyタグが幾つあるか調べる要素をHTMLCollectionに入れて返す
そしてbodyタグは1つしか存在しないので、取得できたbodyタグのリストの最初の要素を取得する。
そしてbody要素は1つしか存在しないので、取得できたbody要素のHTMLCollectionの最初の要素を取得する。
ここまでくればあとの動作は簡単なので、同じようにdivタグ要素、pタグ要素の中身をgetElementsByTagNameメソッドを使って手繰って行き、最後にpタグ要素の中身の最初の中身、つまりは「DOM TEST」のテキストを取得している。
 
それぞれのメソッドとプロパティの解説を行うと、
92 行
: 要素内のデータを取り出す
 
この様に、ツリーを上側から順番に手繰っ降下していくことにより、目標の要素に辿り着いて、その後にそこの情報を読み出したり変更したりする。
そのため、DOMプログラムでは、自分が今XMLいま文書内の何処にどのNodeを操作しているかをイメージ出来る様になる事が重要である。
 
=== 基本的単語の解説 ===
99 行
DOMはその名の中にある「ドキュメント」「オブジェクト」「モデル」の名の通り、XMLの各部分をオブジェクト(モノ)として分割して、それぞれを参照して扱える様にする方法である。XML内部には、タグで区切られた数々のデータがあり、それぞれを種類分けしてプログラムで扱っている。その中でも特によく使うDOMのデータ型は次の3種類である。
 
*; Node(ノード)
: 木構造の「節」。要素だけでなく属性 Attr を示す事もある。
:何処のデータ型でも使う様な基本的な部分を扱っているので、後に理解すれば問題ない。
*; Element(要素)
 
: すべての要素オブジェクトが継承する基底オブジェクト
*Element(要素)
: head要素へのインターフェース HTMLHeadElement, body要素へのインターフェース HTMLBodyElement など術との要素オブジェクトはElement要素のプロパティを持つ。
:HTMLのコードで書くなら、内部テキストのタグ部分に当たる。
*Attribute(; Attr(属性)
 
: DOM 要素の属性へのインターフェース
*Attribute(属性)
:また、これはHTMLのコードで書くなら、
:<img src="seen01.jpg" alt="海沿いの海岸" />
:の「src="seen01.jpg"」や「alt="海沿いの海岸"」の部分に当たる。
 
最終的には、これらのデータのある、場所まで辿りついて、その部分のデータを加工する事を続けるのがJavaScriptによるWebプログラミングになる。
116 ⟶ 113行目:
DOMは、XMLを広くカバーする仕様となっているが、特にHTMLに関しての特別の拡張が行われており、簡潔な書式でHTMLの機能を呼び出せるようになっている。この拡張の中でよく使うのが次の2つである。
 
=== document.getElementById ===
 
document.getElementByIdはDOMプログラミングを実際に行う際に最もよく使う機能で、指定したIDのHTML要素を参照することが出来る。
141 ⟶ 138行目:
 
*ノードの概念
**DOMに関するオブジェクト<br>
**DOM要素一覧
Attr
**CDATAの説明
CDATASection
CharacterData
Comment
CustomEvent
Document
DocumentFragment
DocumentType
DOMException
DOMImplementation
DOMString
DOMTimeStamp
DOMStringList
DOMTokenList
Element
Event
EventTarget
HTMLCollection
MutationObserver
MutationRecord
NamedNodeMap (en-US)
Node
NodeFilter (en-US)
NodeIterator
NodeList
NonDocumentTypeChildNode
ParentNode
ProcessingInstruction (en-US)
Range
Text
TimeRanges
TreeWalker
URL
Window
Worker
 
{{コラム|メモリ内部でのDOMデータ|
DOMを正しく使おうと思えば最終的には何故DOMの文法オブジェクトシステムはこの様に出来ているのか?
ということを理解する必要がある。DOMはXML文書を解析してその内容をメモリ上に展開するとき、イテータークション同士がツリー状に繋がっている。既にJava等でデザインパターンを修得している上級者には[[w:Composite パターン|Composite パターン]]を取っていると言えば分かっていただけるであろう(分からない方はここは飛ばして良い<!-- 初心者の理解する次元ではありませんので -->)。DOMに存在する種々の「データ型」というのは、これの先にある様々な枝が何処でどう繋がれるのかを想像しながら使うものである。使っていく内に実感が追いついて慣れていくと思うが、初学者にはそこまでが単純ではないので頑張って欲しい。
<!--
DOMについての項に関しては、解説すべき項目が多く、とても扱いきれない部分があるので