Jintrick.netagenda2005年10月アーカイブ → 2005年10月20日

Re: ブラウザでミニマムXML (3)

付き合ってもう5年。一部のブラウザのDOM実装って厄介だから、きっちり講義しようという姿勢、その姿勢をみるだけで脱帽する。

DOMRangeを使う方法は、こういう解もあり。ノードの内容物全てを選択するなら、直接的にselectNodeContentsメソッドが使える:

var r = document.createRange();
r.selectNodeContents(parent);
r.deleteContents();

あとここら辺も気になった:

XMLでは、名前の大文字小文字は厳密に区別される(例:div, DIV, Divはみんな別物です)のでcreateElementに指定した名前を変えてしまうようなことは許されません。これが守られてないってことは、つまり、documentとして参照されるアノ文書ノードはXML DOM(DOMコア)の文書ノードと考えることはできない、ということです。

DOM HTMLでは要素名、属性名は全て大文字に展開されることになっている(1.3. XHTML and the HTML DOM)。DOM CoreのDocumentノードというか、それを継承したDOM HTMLのHTMLDocumentノードなので、要素名や属性名を引数に与えるメソッドは仕様に沿って上書きされていると考えれば別におかしくない。

実際のところ、ブラウザ備え付けのdocumentは、XMLのDOM ではなくて、HTML専用のDOM、それもW3CのHTML DOMでさえなくて、かつてブラウザが勝手に実装したDOMもどき(当時DOM仕様がなかったのだから、「もどき」は可哀想だが)です。アノ documentは、互換性の呪縛から逃れることができないので、レガシーHTMLをも対象とした“DOMのようなもの”だと割り切ったほうがいいでしょう。XML DOMの挙動を期待してはいけません。

DOM Level 0とも言われる、かつてブラウザが勝手に実装したDOMもどきは確かに残っているけれども、その上さらにDOM HTMLが実装されたわけで。そもそもDOM HTMLは「レガシーHTML」を対称にしたものなのであって、XHTML1.1以降、即ちapplication/xhtml+xmlでserveされるべき文書では使用不可。不可とまでは書いてなかったか。でも確かそんなニュアンスの一文がどこかに。

新規の文書ノードはXML DOMの文書ノードと考えても(たいていは)大丈夫です。しかし、これはいいことばかりではありません。HTMLが持っていた豊富な機能性が使えないのです。例えば、getElementByIdメソッドは存在しないか、動かないか、動くかも知れないがお手軽にはいかないかです。

こういう状況が改善されるためには、XHTMLマークアップが一般化して、XML DOM(DOMコア)の拡張としてのHTML DOMが、ブラウザのdocumentとして実装される必要があります。

getElementByIdメソッドがDocumentインターフェイスに存在しないのはDOM Level2 Coreを実装していないからだろうし、動かないのはスキーマがないからだし、動くかもしれないがお手軽に行かないのは……なんだか知らんけど、ブラウザのせいじゃないと思うな。少なくともMozillaはきっちり実装してると思うというか間違いなくそれを志向してるから、なんか見つけたら報告が筋。

HTMLが持っていた豊富な機能性が使えないという状況。これはcreateDocument等々でHTMLDocumentインスタンスを作る方法が仕様に示されていないのが原因では。doctype引数にHTMLのそれを与えれば良いのかというと、特に書かれていないし。どっかに書かれてたりするのかしら。そもそも推奨されていないのではないだろうか。createDocumentメソッドは、DOM HTMLのみの実装には必須ではないのだし。

実際のところIEにはバグが多く「こんなのDOMじゃない」と割り切ったほうが賢い。それでもブラウザを使って「W3C DOM」を正しく学ぼうというのなら、WWWブラウザを使うからといって、開くHTML文書がウェブページである必要はないということを考えるべき。それでは実際的でないというのなら、scriptletもある。


webmaster@jintrick.net
公開: 2005年10月20日
カテゴリ: DOM ,意見交換, 批判等