XML(XHTML)とHTMLの判定
document.contentType == "application/xhtml+xml"なページでの$X - 0xFFのおまけ的な話です。
まず、OperaのNAMESPACE_ERRの件は都合の悪いものを見なかったことにするかのようにスルーしてましたが、単に気づいてなかっただけです。。
Opera (9.24/9.5) では resolver が "" (空文字列) をかえすと、null を返したときと同じように NAMESPACE_ERR を投げてしまう (Safari や Gecko では名前空間が空ということにしてくれる)。つまり Opera だと全適用のユーザスクリプトで XPath つかうときはページが XML か HTML かで式自体を変えないといけないのでめんどい。
http://subtech.g.hatena.ne.jp/cho45/20071119/1195408940
ヒドイ話ですね、Operaさん。9.60でも直ってませんでした。Kuruma さんが報告してくれているので、そのうち。。
で、このためにページが XML か HTML か判定しなくてはいけないわけですが、document.contentTypeはOperaやSafariでは使えないので、代用案を考えてみました。
ありがちな気がしますが、
- HTML では tagName を取得すると必ず大文字
- XML では書かれた文字そのまま
という特徴を使って、適当な要素を作って、その tagName が大文字か小文字か調べるという方法が使えます。
var isHTML = document.createElement('p').tagName == 'P';
で、 prefix ありの XPath となしの XPath を両方用意しておいて、切り替えて使うか、予め用意できないなら正規表現で。。。
うーん、イマイチ*1。
関連:ウーパーの人(id:uupaa さん)がちょうど同じテーマのエントリを書いていた HTMLDocument と XMLDocument を見分ける方法 - latest log
*1:実は、誰か素敵な正解を持っててさらっと教えてくれたりしないかなーと、ほのかな期待をもってこういうエントリーを書いていたり。