XML(XHTML)とHTMLの判定

document.contentType == "application/xhtml+xml"なページでの$X - 0xFFのおまけ的な話です。

まず、OperaのNAMESPACE_ERRの件は都合の悪いものを見なかったことにするかのようにスルーしてましたが、単に気づいてなかっただけです。。

Opera (9.24/9.5) では resolver が "" (空文字列) をかえすと、null を返したときと同じように NAMESPACE_ERR を投げてしまう (SafariGecko では名前空間が空ということにしてくれる)。つまり Opera だと全適用のユーザスクリプトで XPath つかうときはページが XML か HTML かで式自体を変えないといけないのでめんどい。

http://subtech.g.hatena.ne.jp/cho45/20071119/1195408940

ヒドイ話ですね、Operaさん。9.60でも直ってませんでした。Kuruma さんが報告してくれているので、そのうち。。

で、このためにページが XML か HTML か判定しなくてはいけないわけですが、document.contentTypeはOperaSafariでは使えないので、代用案を考えてみました。

ありがちな気がしますが、

  • HTML では tagName を取得すると必ず大文字
  • XML では書かれた文字そのまま

という特徴を使って、適当な要素を作って、その tagName が大文字か小文字か調べるという方法が使えます。

var isHTML = document.createElement('p').tagName == 'P';

で、 prefix ありの XPath となしの XPath を両方用意しておいて、切り替えて使うか、予め用意できないなら正規表現で。。。
うーん、イマイチ*1

関連:ウーパーの人(id:uupaa さん)がちょうど同じテーマのエントリを書いていた HTMLDocument と XMLDocument を見分ける方法 - latest log

*1:実は、誰か素敵な正解を持っててさらっと教えてくれたりしないかなーと、ほのかな期待をもってこういうエントリーを書いていたり。