Deprecated : The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
DOM Support Report - Cross Tips
DOM Support Report - Cross Tips
まあ、標準なのに Cross もへったくれもないはずなんだけど、そうはいかないのが現実。
Diff:
ブラウザと DOM 仕様のそれぞれのリリース時期を考えるとやむなしと思える部分もあるのだが、
IE は DOM1 を一部サポート、 Mozilla は DOM2 を一部サポート、といった感がある。
それぞれがサポートしているプロパティについて比較すると、次のような違いが見られる。
Node オブジェクトの attributes プロパティに、
Mozilla は文書内に記述された属性だけが含まれるのに対し、
IE は考えられる全ての属性を含めている(と思われる)。
Node オブジェクトの attributes プロパティは、
Mozilla では配列状の構造をしていて、
attributes.item(n) の他に attributes[n] という記述でアクセスできる。
IE では加えて連想配列状のアクセスも可能で、
attributes[attrName] のような記述がとおる。
Node オブジェクトの childNodes プロパティに、
Mozilla は空白文字(Tab、Space、改行等)のみの TextNode も含めるのに対し、
IE はこのような TextNode は存在しないものとして除外している。
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 は知らんです。
IE の独自拡張として、 <!--[if IE 5]> ~ <![endif]-->
という CommentNode 内の CDATA を解釈して、当該 CommentNode と置換する。
結果として、この CommentNode 自体は DOM から抹消される。
挙動としては処理命令に近い。
Buggy::IE
次に挙げる点は、実装されてはいるが仕様の定義と異なる挙動をするものである。
バグもしくは後方互換性の為の実装と思われる。「~に未対応」というものは除外。
[IE] 注釈宣言(<!---->, nodeType=8) や文書型宣言(<!DOCTYPE>, nodeType=10) が
ElementNode(nodeType=1) として扱われる。
[IE] document オブジェクトが Node, Document としてのインターフェイスを
ほとんど備えておらず、nodeType も nodeName も取得することが出来ない。
[IE] noscript 要素(HTMLElement) の childNodes.length が必ず 0。
非準拠の innerHTML を使わなければ要素の内容にアクセスできない。
[IE] HTMLHeadElement の childNodes で、
実際のHTML文書における head 要素内での子要素の出現順序に関係なく
item(0) が必ず HTMLTitleElement になる。
文書内に title 要素が存在しない場合についても同様である。
そしてこの HTMLTitleElement は text プロパティに値がある場合でも
childNodes.length=0, hasChildNodes()=false である。
[IE] 独自拡張の実装についてであるが、
<![if ! IE 5]> ~ <![endif]> の内容を一切認識しない。
DOM から完全に隠蔽され、その内容へはアクセス不能である。
そもそもこれは HTML/XML/XHTML のどの仕様でも buggy な記述で
現行の主な Web ブラウザがたまたまこの記述を注釈として扱うだけだと思うのだが
その辺について知識のある方教えてください。
[IE] このスクリプトでは仕様にあるプロパティのみ表示するように作成しているので
表面上はわからないのだが、 HTMLFormElement と、そのプロパティである elements が
事実上同じ物を指しているらしく、全く同じプロパティを持っている。
仕様と挙動の異なる実装をしているわけではないが、
elements プロパティから nodeType=1, nodeName='FORM' が取得できてしまうので
オブジェクトの型を判定するようなルーチンを書く場合には注意が必要だろう。
Buggy::Mozilla
ここで挙げるよりも、Bugzilla を見たほうがよいだろう。
[Mozilla] 仕様に定義されているはずのメソッド及びプロパティに、
用意されてはいるが実際に動作しなかったり、値があるのに null や空文字列を返すメソッドやプロパティがいくつかある。
Bugzilla に報告されている DOM 関連のバグは下記で見られる。
特に DOM2 CSS/Events 等 Core/HTML 以外で報告されているバグに、Target Milestone (対応予定バージョン)
をはっきりと設定せず、"Further"(将来) とされているものが目立つ。
Trap:
ハマるとなかなか抜け出せなさそうなこと。というか自分がしばらくハマったこと。
[IE] alert( Element.attributes.item(n) ) とやった時に表示される文字列は、
実は Element.attributes.item(n).nodeValue の値である。
つまり、alert( Element.attributes.item(n) ) の表示結果が null でも
それは item(n).nodeValue が null ということであ item(n) 自体は存在するので
alert( !Element.attributes.item(n) ) は false になる。
[IE][Mozilla] <IMG SRC="">, <A HREF=""> 等
HTML アトリビュートのデータ型が %URI; で、値が相対 URI で与えられている時、
Property Attribute (Element.src の様にオブジェクトのプロパティに露出する HTML属性) と、
Element.getAttribute(attributeName) の値が
文書内記述通りの相対 URI だったり、内部的に変換された絶対 URI だったりする。
主なところは次のような感じ:
IE Property Attribute
IE getAttribute()
Mozilla Property Attribute
Mozilla getAttribute()
A HREF
絶対URI
絶対URI
絶対URI
記述通り
IMG SRC
絶対URI
絶対URI
絶対URI
記述通り
LINK HREF
記述通り
記述通り
絶対URI
記述通り
script src, iframe src については、どれも記述通りの URI を返すようである。
仕様に沿うならば記述通りの値を返すべきところなのだろうが、
DOM0 ベースの過去の UA への互換性を考慮した挙動と思われる。
なお、Element.attributes.item(n).nodeValue の形式で参照する場合は、
一様に記述通りの相対 URI を取得できるようだ。
Issued: 2001-02-08 /
Rivised: 2017-02-05 /
All rights reserved. © 2001-2017 TAKI