オライリーの JavaScript 第6版 (以下本書)を図書館から借りて、 いろいろ調べている。 15 章の JavaScript のドキュメントの制御は知らないので、少し調べてみた。
DOM (Document Object Model) は HTML や XML ドキュメントのコンテンツを表したり操作したりする API である。
getElementById("id_name") を使う。
document オブジェクトのプロパティはたくさんあって覚えきれない。 注意しておきたいことがある。 document オブジェクトに限らないが、DOM でオブジェクトのプロパティを得るためには
for (let prop in document) { document.writeln(prop); }
という方法をとる。
document オブジェクトのプロパティ表示1
なお、親クラスのプロパティ(組み込みのプロパティも含む)ではなく、 自分のみの固有のプロパティを知るには、hasOwnProperty メソッドを使って判別する。
document オブジェクトのプロパティ表示 2
またObject.keys(document) とする方法もある。自分のみの固有のプロパティが配列で帰ってくる。
document オブジェクトのプロパティ表示3
Object.getOwnPropertyNames(document) を使う方法もある。
document オブジェクトのプロパティ表示4
let upper = { usotuki: 0.003 }; let lower = Object.create( upper ); // lower はプロトタイプに upper をもつオブジェクト "usotuki" in upper; // => true "usotuki" in lower; // => true
let upper = { usotuki: 0.003 }; let lower = Object.create( upper ); // lower はプロトタイプに upper をもつオブジェクト upper.hasOwnProperty("usotuki") //=> true lower.hasOwnProperty("usotuki") //=> false
本書の 15.10.2 項では、document.write() メソッドについて詳述されている。ここでは、 document.write() メソッドについて、新たにコードを書くときには、もはや必要ありません。とある。そして、 具体的に他のコードで置き変える方法については、p.444 の例 15-10 にある通り、 innerHTML 用のストリーム API で述べられている。mozilla の例は下記にある。 Element: innerHTML() メソッド(developer.mozilla.org)しかし、innerHTML プロパティを使う方法はプロパティの書き換えを伴うのでオーバーヘッドがあるため、 書き換えを伴わない場合は element.insertAdjacentHTML() メソッドを使うのがよいと Mozilla にはある。 Element: insertAdjacentHTML() メソッド(developer.mozilla.org) そこで、element.insertAdjacentHTML() メソッドを使って書き換える方法を述べる。 併せて、単なる書き換えだけでは書き出しに失敗することがあるので、その原因と対応方法も述べる。
新たにコードを書くときには、もはや必要ありません。
単純に、次のコードを書き換えることを考える。
<body> ... <script> document.write("<hr>"); </script> ... <body>
まず考えるのは、element.insertAdjacentHTML() メソッドを使うために、 element を指定することである。element オブジェクトにはいろいろなものがあるが、 ここでは getElementById() メソッドで得られるオブジェクトを使う。getElementById() メソッドは、 たとえば、<div id="foo"></div> という HTML 要素の id 属性と結び付く。だから、 上記のコードは次のように置き換えられるはずだ。
<body> ... <div id="hr"></div> <script> let d = document.getElementById("hr"); d.insertAdjacentHTML('afterend',"<hr>") </script> ... </body>
エレメントを div とともに導入したり、エレメントのオブジェクトの変数を導入したりするので、 多少タイピング量が増えるが、JavaScript の読み込みのタイミングにかかわる諸問題を解決するため、 必要な手間だと考えよう。なお、element.insertAdjacentHTML の第1引数の 'afterend' とは、指定された HTML 要素のうち、閉じタグの直後に挿入することを指示している。
このコードは動作する。すなわち、水平線は表示される。 では、スクリプトを body 要素ではなく head 要素に書いたらどうか。
<head> ... <script> let d = document.getElementById("hr"); d.insertAdjacentHTML('afterend',"<hr>") </script> </head> <body> ... <div id="hr"></div> ... </body>
このコードは動作しない。すなわち、水平線が表示されない。これは、head 部にスクリプトを書いたために、 スクリプトが実行された時点でエレメントが取得できていないからだ。 エレメント取得に失敗したので、コードは動作しない。エレメントが取得できない問題を解消するには、 エレメントが確実に取得できたあとでこのスクリプトを実行するようにすればいい。 エレメントが確実に取得できたあととは、ページのロードが終わった後のことである。 具体的には、 window.onload にスクリプトの内容を代入する。
なお、動的にオブジェクトを生成する方法として、createElement などが使える。
まりんきょ学問所 > JavaScript 手習い > ドキュメントの制御