XHTML1.0のDOCTYPE宣言にはいくつか種類があり、IE7以上では常に最新のレンダリングエンジンである「標準モード」として動作します。しかし、IE6は一部の宣言方法で一番古いレンダリングエンジンである「Quirksモード」として動作してしまいます。
(※参考 : The <?xml> prolog, strict mode, and XHTML in IE - IEBlog )
IEには古いレンダリングエンジンを再現させるドキュメントモードという機能が備わっており、「互換表示ボタン」「互換表示リスト」「ローカルネット互換表示」「X-UA-Compatible」などを通じてドキュメントモードを制御し、新しいバージョンへ移行させることが多いでしょう。しかし、これらの機能はDOCTYPEスイッチの切り替えアルゴリズムまでは再現してくれず、問題となるケースがあります。
具体的には、以下の通りです。
6 | 8〜10 | DOCTYPE宣言 |
S | S | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
Q | S | <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
S | S | <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
Q | S | <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
S | S | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> |
Q | S | <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> |
IE6でテストされたWebシステムを開発していた際に、開発者が誤動作に気が付かず「Quirksモード」を前提に画面のレイアウトを作りこむと、IEのバージョンアップ時に挙動がおかしくなることがあります。
移行時の対策
誤動作によりXHTMLドキュメントをQuirksモードで動作させてしまっている場合、IE8以上ではX-UA-Compatibe以外からQuirksモードを再現させる方法はありません。このため、サーバ管理者はシステムを動作させているAP製品に対して、HTTP Response Headerへ以下のパラメータを応答させるよう設定が必要になります。
X-UA-Compatible: IE=5
より詳細な設定の方法については、以下のページを参照して下さい。
どういうケースが想定されるか?
この事象は、決してレアケースというわけではありません。
業務系で利用されるServer-side Scriptingの既定は、HTML5のような新しいWeb標準を利用する場合でも、XHTMLに沿って記述することが多いです。JavaのJSFもまさにそうでしょう。
DOCTYPE宣言は、XHTML1.0で宣言しても、HTML5の機能を利用することが可能です。IEも含め多くのWebブラウザは、XHTML1.0、HTML5、どちらの宣言を行っても、同じレンダリングエンジンが選択されるようにできています。HTML5は一部の廃止タグを除き、XHTML1.0と相互運用可能な言語仕様になっているため問題になりません。
Webブラウザ以外のソフトウェアからHTMLを読み込ませる場合、XMLパースが行える方が便利でしょう。この場合、XML宣言が行えるXHTML1.0のDOCTYPE宣言は、非常に有用なものとなります。XML宣言は本来任意ですが、無いと動作しなパーサものもあります。素直にHTML5のDOCTYPE宣言を行いたいところですが、XMLパーサの活用を考えると、今後もあえてXHTMLのDOCTYPE宣言を行うということは少なくないはずです。
IE6向けシステムは、JSPのような古い技術を利用していた場合は問題になりません。しかし、それこそJSFのような新しい技術を使って強引に動作させようとすると、何かしらの問題を作りこむ可能性を持ちます。IEのバージョンの世代と、サーバ技術の世代に開きが大きい場合は、注意して下さい。