IEのドキュメントモード機能が存在しなかったIE5〜7で、どのバージョンでも同じ仕様を持つプラットフォームを得るには、IE5の動作を再現させる「Quirksモード」を有効にするしか手段がありませんでした。
当時のIEは相互運用性が低く、バージョンごとの動作が異なるため、マルチバージョン下で動作するコンテンツ制作はコストが高くなりがちでした。そこで、少し複雑性の高い作り込みをクライアント側へ仕込む場合、レガシーIE向けコンテンツを動作させるために作られたはずの「Quirksモード」を、あえて有効にして新規開発を行った方が、IEのマルチバージョン下で動作させるWebシステムのリスク・コストを最小化させるという最悪のジレンマに陥りました。
このジレンマは、IE8への段階的移行を行っている際にも有効になります。IE6や7で動作させていた時は最新のレンダリングエンジン(標準モード)で動作させていたにも関わらず、IE8では動作がおかしくなるため、全てのHTMLドキュメントからDOCTYPE宣言を外し、Quirksモードが有効化させるという良くない手段に出てしまいます。
本来であれば、「イントラネット互換表示」を活用すべきですが、ActiveDirectoryへの変更が提案できないなどの要因が絡み、システム単体で対策できるDOCTYPEを外すという手段に出てしまいます。非常に良くないジレンマです。
このバッドプラクティスは、理論上、社内の標準OSがWindows7になるまで有効化します。既存の環境にはIE5がいないから大丈夫だと安心していると、問題になることがあります。OSの移行担当者は、Windows XPのバージョンアップ対応では以下の点に注意する必要があります。
1. IE8〜11への移行時の注意点(その1)
IE8から11では、X-UA-Compatibleという機能が提供されています。このパラメータを利用した場合、IEはDOCTYPEスイッチよりも、X-UA-Compatibleの設定を優先してしまいます。IE6向けのWebシステムをIE8〜10へ移行する場合、X-UA-CompatibleにはIE7を指定するのが定石です。しかし、何も考えずに以下を設定するのは危険です。
X-UA-Compatible : IE=7
最も安全なのは、以下の設定です。
X-UA-Compatible : IE=EmulateIE7
この設定は、デフォルトはIE7互換で動作させ、DOCTYPEスイッチの内容次第ではQuirksモードで動作させるという動きになります。
そもそもですが、Windows7系の場合、IE6向けコンテンツを動作させるには、「イントラネット互換表示」を利用するか、IEのバージョンが9〜10の場合は「互換表示リスト」を利用すべきです。これらの機能を利用した場合、DOCTYPEスイッチの判定が優先されるため、リスクが最適化されます。通常時はIE7モードとして動かし、DOCTYPEスイッチでQuirksモードが有効な場合は、Quirksモードが優先されるという、望ましい動作をします。
なお、IE8だけは、互換表示リストが有効な場合は常に「Quirksモード」になります。このため、移行は「イントラネット互換表示」を使うか、「X-UA-Compatible」を各システムに設定して回るという非常に泥臭い対策を行わなくてはいけないことがあります。
2. IE8〜11への移行時の注意点(その2)
IE6はXHTML1.0のDOCTYPEの解釈に問題があり、意図せずQuirksモードで動いていることがあります。これに気付かず開発が行われていた場合、IE7以上への移行では、イントラネット互換表示も、互換表示リストも使うことができない、実質的にX-UA-Compatibleでしか対策が行えないという状況に陥ります。
詳しくは、以下のページを参照して下さい。
3. IE10への移行時の注意点
IE10では、Quirksモードが2種類あります。単純にDOCTYPE宣言を使ってQuirksモードを動作させた場合、IE5とは互換性の無いQuirksモードが動作してしまいます。これを改善するには、X-UA-Compatibleとの合わせ技が必要です。
詳しくは、以下のページを参照して下さい。
4. IE11への移行時の注意点
IE11からは、DOCTYPEスイッチが無視されます。従来の方法では、Quirksモードは有効になりません。
(※参考 : IE11ではDOCTYPE宣言がチェックされない - ふろしき.js )
IEは11でドキュメントモードが非推奨化されたため、今後は機能が廃止されることも予想されます。Quirksモードで動作しているWebシステムは、「動作/機能検出」の指針に基づいた作り込みで、相互運用性の高いIE9以上で動作するように改修する必要があります。
(※参考 : 機能検出と動作検出の使用 - Microsoft )