DOM Support Report - Cross Tips

まあ、標準なのに Cross もへったくれもないはずなんだけど、そうはいかないのが現実。

Table of Contents:

Diff:

ブラウザと DOM 仕様のそれぞれのリリース時期を考えるとやむなしと思える部分もあるのだが、 IE は DOM1 を一部サポート、 Mozilla は DOM2 を一部サポート、といった感がある。

それぞれがサポートしているプロパティについて比較すると、次のような違いが見られる。

  1. Node オブジェクトの attributes プロパティに、 Mozilla は文書内に記述された属性だけが含まれるのに対し、 IE は考えられる全ての属性を含めている(と思われる)。
  2. Node オブジェクトの attributes プロパティは、 Mozilla では配列状の構造をしていて、 attributes.item(n) の他に attributes[n] という記述でアクセスできる。 IE では加えて連想配列状のアクセスも可能で、 attributes[attrName] のような記述がとおる。
  3. Node オブジェクトの childNodes プロパティに、 Mozilla は空白文字(Tab、Space、改行等)のみの TextNode も含めるのに対し、 IE はこのような TextNode は存在しないものとして除外している。
  4. Mozilla でウィンドウ表示した XML 文書は生の XML なので window.document がそのまま XML の DOM を持っているが、 IE でウィンドウ表示された XML 文書は XSLT の出力結果である。
    • まず、document.documentElement の nodeName が必ず HTML であり、 HTMLHeadElement(nodeType=1, nodeName=HEAD) と HTMLBodyElement(nodeType=1, nodeName=BODY) を子要素に持つ。
    • type="text/css" である <?xml-stylesheet?> は head 要素下に HTMLLinkElement(nodeType=1, nodeName=LINK) として入っている。
    • XML 文書の実ルート要素は body 要素下に入る。
    • つまり XHTML 文書を text/xml として IE で表示すると body 要素の下に html 要素が来てしまうという気持ちイヤーンな挙動に…。 まあブラウザ側の内部的な処理と思えばいいんだけど。
    ※ JScript で XML 文書を読み込んだ時の DOM は知らんです。
  5. IE の独自拡張として、 <!--[if IE 5]> ~ <![endif]--> という CommentNode 内の CDATA を解釈して、当該 CommentNode と置換する。 結果として、この CommentNode 自体は DOM から抹消される。 挙動としては処理命令に近い。

Buggy::IE

次に挙げる点は、実装されてはいるが仕様の定義と異なる挙動をするものである。 バグもしくは後方互換性の為の実装と思われる。「~に未対応」というものは除外。

  1. [IE] 注釈宣言(<!---->, nodeType=8) や文書型宣言(<!DOCTYPE>, nodeType=10) が ElementNode(nodeType=1) として扱われる。
  2. [IE] document オブジェクトが Node, Document としてのインターフェイスを ほとんど備えておらず、nodeType も nodeName も取得することが出来ない。
  3. [IE] noscript 要素(HTMLElement) の childNodes.length が必ず 0。 非準拠の innerHTML を使わなければ要素の内容にアクセスできない。
  4. [IE] HTMLHeadElement の childNodes で、 実際のHTML文書における head 要素内での子要素の出現順序に関係なく item(0) が必ず HTMLTitleElement になる。 文書内に title 要素が存在しない場合についても同様である。 そしてこの HTMLTitleElement は text プロパティに値がある場合でも childNodes.length=0, hasChildNodes()=false である。
  5. [IE] 独自拡張の実装についてであるが、 <![if ! IE 5]> ~ <![endif]> の内容を一切認識しない。 DOM から完全に隠蔽され、その内容へはアクセス不能である。 そもそもこれは HTML/XML/XHTML のどの仕様でも buggy な記述で 現行の主な Web ブラウザがたまたまこの記述を注釈として扱うだけだと思うのだが その辺について知識のある方教えてください。
  6. [IE] このスクリプトでは仕様にあるプロパティのみ表示するように作成しているので 表面上はわからないのだが、 HTMLFormElement と、そのプロパティである elements が 事実上同じ物を指しているらしく、全く同じプロパティを持っている。 仕様と挙動の異なる実装をしているわけではないが、 elements プロパティから nodeType=1, nodeName='FORM' が取得できてしまうので オブジェクトの型を判定するようなルーチンを書く場合には注意が必要だろう。

Buggy::Mozilla

ここで挙げるよりも、Bugzilla を見たほうがよいだろう。

  1. [Mozilla] 仕様に定義されているはずのメソッド及びプロパティに、 用意されてはいるが実際に動作しなかったり、値があるのに null や空文字列を返すメソッドやプロパティがいくつかある。 Bugzilla に報告されている DOM 関連のバグは下記で見られる。 特に DOM2 CSS/Events 等 Core/HTML 以外で報告されているバグに、Target Milestone (対応予定バージョン) をはっきりと設定せず、"Further"(将来) とされているものが目立つ。

Trap:

ハマるとなかなか抜け出せなさそうなこと。というか自分がしばらくハマったこと。


Issued: / Rivised: / All rights reserved. © 2001-2017 TAKI