特殊な状況下にあるXHTML文書でJavaScriptを動かす場合、色々動かない場合がある

なお、以下はFirefoxの話です。

要素名を大文字でこのように書くと

document.createElement('DIV');
document.getElementsByTagName('DIV');

ノードの生成はできるけどstyleプロパティがundefinedだったり、ノードの探索ができなかったりします。代わりに小文字を使って

document.createElement('div');
document.getElementsByTagName('div');

としておけば問題ありませんでした。
とあるライブラリで要素名の指定が全て大文字になっていて、これで小ハマリしました。



最初「XHTMLだからだろう」と思っていたので、内容が全く同一の別XHTML文書で試して問題無く動いた時はちょっと困りました。

ふと思い立ち、問題が起きている方でdocument.writeしたところdocument.write is not a functionΣ(゚Д゚;エーッ!
混乱しつつページの情報でMIMEタイプを確認すると、問題無い方はtext/htmlなのに対して、問題が起きている方はtext/xmlになっていました。どちらもローカルの文書で、内容は全く同じでした。違いは・・・拡張子が有る(.html)か無いかでした。



Content-Typeヘッダの無い(つまり主にローカルの)XHTML文書は、

  • 拡張子が無い場合
    • XML宣言がある → text/xml
    • XML宣言が無い → text/html (これはたまたまかも)
  • 拡張子がある場合はそれに従う

となっているようです。meta要素でContent-Typeを指定していてもダメのようです。

タイトルの「特殊な状況下にあるXHTML文書」はtext/xmlとして扱われているXHTML文書のことで、要するにwindow.documentがHTMLDocumentではなくてXMLDocumentになっているのでHTML用のJavaScriptが上手く動かなかったというオチなのです。あー何か疲れた。