今回久しぶりにHTMLなど書いてみたり、Javaスクリプトも新ネタ「AJAX」を仕入れたりで、いろいろ試してたりしてたのですが。
インターネット・エクスプローラー(以下めんどいのでIEと略)も7にバージョンアップして、「期待しちゃだめだ、期待しちゃだめだ・・」といいつつ、いろいろと実験してみて。
・・久しぶりに絶望しました。IE6から変わってないー。
ちょっと技術よりな愚痴なので意味不明な部分も多々あると思いますが、どうせこんなページ誰も読まないだろうということで細かい説明無しで愚痴をこぼしてみます。
タブブラウザになったりして、確かに見た目は変わってます。でも、中身はどこがどう変わったかというと・・。
スタイルシート {position: fixed;} に対応したり、XHTMLを書式通りに記述すると互換モードになるバグがなくなっていたり、一瞬そこそこいじってあるように思ったのですけど・・。
IE6にはXHTMLにXML宣言を入れると、互換モードに入るというどうしようもないバグがあります。HTMLの先頭がDTDでないと互換モードに入るらしいです。
IE7は基本、IE6をちょっといじっただけで基本は同じものみたいです。
IE6と同じということは、IE6はIE5と基本同じものだし。
え、IE5はIE4のバグフィックス版でしょ・・。
つまり、IE7≒IE4・・・・?
な、なんだってー!
ブラウザ戦争について今さらここでうだうだ書くのも面倒なのでそのへんはぐぐってください。
とりあえず、力任せにブラウザ戦争を制圧したマイクロソフトは、IE4でその進化をやめてしまいました。
IE4はウィンドウズ98用に開発されたブラウザです。つまりは1998年のブラウザです(正確には1997年製)。IEはつまり、10年前のブラウザということになります。
10年もたてば、ウェブ技術も結構進化してたりします。DOM Level2やXHTMLなどの技術はまだ存在してなかった頃のブラウザを、マイクロソフトはいまだに「最新版」として出荷し続けてることになります。
IEのバージョンアップはおもに見た目の変更と、XML関係の機能追加です。・・というか、ほぼそれだけです。
でもって、今時の最新ブラウザ、ファイヤーフォックス、オペラ、サファリなどが対応しているDOMのオブジェクトも、IEだけは対応してないんですよね・・。
XHMHttpRequestオブジェクト(最近はやりのAJAXのキモとなるオブジェクトです)は対応しました。っていうか、もともとIEが最初にActiveXとして実装したものを、各社が標準化して実装したものなので、対応は簡単だったわけなのですが。
なのでJAVAスクリプトを組んでいても、「IEと、それ以外のブラウザとで処理をわける」といった小細工が必要になってきたりします。
他のブラウザでは標準で使える機能が、IEにはなかったり、互換性のない独自実装になっていたり。
ここのホームページに最新履歴を表示させる機能も、最初はIE非対応でした。
IEのせいでXHTMLがXMLとして解釈できるようにできない(理由はこのあと)ので、一旦テキストとしてダウンロードして(2度手間っぽいけど)DOMParserを通して・・って、IEにはDOMParserがない!
なるほど、IEではDOMParserの代わりにXML.loadXMLメソッドを使うのかー。・・あれ、おかしいな、動かない・・。って、loadXMLは今時UTF-16専用だと-。
とうとうそこで放り投げて、(IEを含む)レガシーブラウザ非対応としました。
そして一時期は、いっそXMLで作ってXSLTでXHTMLに変換して表示、というなんか妙に最新機能に頼った仕組みにしてみたりもしました。なぜかレガシーブラウザの割にこんな最新技術に対応してるんですよね・・。
でもXSLTは難しすぎて途中で投げ出しました。タグの入れ子構造をどうやって表現すればいいのか考えてると、わたしのカヨワイ脳みそが爆発しそうになったためです。
現在はXHTMLに戻しています。最新ブラウザではレスポンスヘッダをいじってXMLとして読み込み、普通のブラウザではDOMParserを使って解析しています。
別に処理をわける必要はないのですが(DOMParserで統一できる)、ここは「ラボ(実験室)」なので使える方法は実験します。
IEでは・・DOM使わずに手作業(というのかな・・?)で解析しています!JavaScriptの読める方は、一度コードを見てください。きっと鼻から麦茶吹き出します(笑)。
そしてなにより今回ものすごーく絶望させられたのが。
IEはXHTML非対応。
一応、XHTMLの表示はできます。でもこれは実は何の不思議もなく、XHTMLの文法はHTMLとしても解釈できるように作られています。
よってIEはXHTMLを、ただのHTMLとして解釈して表示しているに過ぎません。
ところが。HTMLのメディアタイプはtext/htmlですが、XHTMLはapplication/xhtml+xmlです。
なのですが、ここで壁が。
現在のIEが作られた10年前にはそんなメディアタイプありません。サーバー側でこれを指定したら、表示できないどころかいきなりダウンロードのダイアログが出ました!IEから見たらapplication/xhtml+xmlなんて、未知のファイルなので処理できません。ダウンロードするかキャンセルするかの問い合わせをするしかないということになります。
メディアタイプをapplication/xhtml+xmlにできればXMLとして解釈できるので、いろいろ小細工できたりするのですけど・・。最初、ホームページの更新履歴表示はこの方法でやろうとした。結果は・・前述の通り、撃沈しました。
仕方がないのでtext/htmlとしてサーバーから送ることに。
ちなみにここでAnother HTML-lintから減点されます。application/xhtml+xmlを指定すると満点になりますが、IEで表示できなくなります。
ところが、これだけではまだ表示できなかったりします。metaタグでメディアタイプをtext/htmlとして、文字コードもUTF-8と指定しないと表示できずに画面が真っ白のままです。
理由をよくよーく調べると、IEは(少なくともIE7は)、[表示] - [エンコード]メニューにおいて文字コードの判別を「日本語(自動選択)」にすると、JIS・Shift-JIS・EUCから選択するようです。・・・って、いまどきUTF-8は無視かい?!
これを「自動選択」に変更すれば、UTF-8を含む判別を行います。
XHTMLだとmetaタグでメディアタイプを指定するのは反則なんですけど・・。
えーい、好きにしやがれこのレガシーブラウザめー。
・・・てなわけで。
XHTML1.1だといいつつIEのためだけに所々ほころびが。
バリデーターでも警告出ますけど、一応パスはします。なんか釈然としないものは感じますけど・・。
2011/1/1追記
とうとうあきらめてXHTML1.1→XHTML1.0へと退化することにしました。XHTML1.0ならメディアタイプ"text/html"が「許容」されてますし、metaタグで文字コード指定するのも文法違反ではないので・・。
ただし、もうIE7以下のブラウザは「相手にしない」という方針で、多少崩れるのは「気にしない」ことにします。確認もしていません。今時IE6.0等を使っていて表示が崩れるというのは、旧式ブラウザをデメリットを承知の上で使用しているものと考えます。
IE9?開発者が今まで何度「今度のIEはweb標準に準拠しました」に騙されてきたと思ってるんですか・・。