ふろしき Blog

コンテンツサービスを科学する株式会社ブートストラップ代表のブログ

Compat Inspector - ソースコードからIE独自機能を機械的に検出しWeb標準へ置き換えさせる方法

古いWebコンテンツではIE独自の機能を利用しないことには、リッチな機能を盛り込むことが実質的に不可能という状況でした。しかし、IE9以上からはWeb標準への準拠が高く、Microsoft側でも、IE独自機能に依存しないWeb標準へ準拠したコンテンツ作りを推奨しています。

IE独自機能はバージョン8以降削除される傾向にあり、見落とされると、Webコンテンツのライフサイクルへ悪影響を与えてしまいます。百害あって一利なし、徹底した排除が求められています。本記事では、この作業を人間の感覚でなく、機械的に行う方法について解説します。

★ 誰だって、IE独自機能は機械的に検出したいはず

チェック作業を人の手で行うと、必ず見落としが発生してしまいます。何がIE独自実装で何がWeb標準化を見極めることができないエンジニアに制作/開発を行わせる場合、ソースコードを逐一チェックするのでなく、コンピュータにより機械的にチェックできるようにしたいはずです。

B2BのようなIEのバージョンで縛り開発を行うケースでは、テスト環境が絞られるため、IE独自機能による作り込みの検出をより困難にさせます。ソースコードレビューによるチェックも効果の高い対策ですが、大規模開発ではこれをプロジェクトマネジメント側で可視化し評価できるよう、機械的にチェックできる仕組み作りが求められます。

★ 機械的な検出には「Compat Inspector」が使える

こうしたニーズに応えるため、Microsoftは「Compat Inspector」というツールを提供しています。Compat Inspectorを利用すれば、IE独自機能を検出し、一覧として列挙させることができます。そして大抵の場合は、どのWeb標準に置き換えるべきかアドバイスを行ってくれます。

JavaのFindBugsのように、開発のワークフローに組み込んで活用するのに向いているでしょう。

▼ Compat Inspector
http://ie.microsoft.com/testdrive/html5/compatinspector/

1. Fiddlerのインストールから実行まで

Compat InspectorはJSライブラリであり、検証先のHTMLドキュメント内にScriptタグで埋め込むことにより利用することができます。ただ、開発版から商用版へ切り替えを行う際に、ソースコードに手を加える事を嫌うケースが多いはずです。ビルドプロセスへ組み込むにも、それなりの作り込みを要する上、無駄にバグを作りこむリスクを負うことになります。

こうした背景もあり、Compat Inspectorは単独でなく、「Fiddler」というプロキシツールと併用するのが一般的です。Fiddler側に設定さえ作り込めていれば、1クリックでCompat Inspectorを利用できるため手軽です。また、最近のMicrosoftには珍しく設定をテキストベースで行うという特徴を持ち、環境の配布が容易で大規模での活用にも適しています。

1章ではまず、Fiddlerのインストールを行ってみましょう。
f:id:furoshiki0223:20140102121606p:plain

▼ Fiddlerのダウンロード
http://fiddler2.com/get-fiddler

  • Windows版 : .NET2版と.NET4版が提供されています。Windows 7には.NETの3.5.1がインストールされているため、前者の.NET2版を選択するとトラブルリスクも低いでしょう。
  • Mac/Linux版 : MacやLinuxのようなUNIXベースの環境では、Xamarin社が開発するMonoという.NET互換フレームワークをインストールする必要があります。

f:id:furoshiki0223:20140102112223p:plain

▼ インストールの流れ(Windows版)
f:id:furoshiki0223:20140102111359p:plain

▼ Fiddlerの起動方法(Windows版)
f:id:furoshiki0223:20140102111719p:plain

2. Compat InspectorをFiddler側へ組み込む

前章でFiddlerを実行するまでの流れは、理解できたかと思います。FiddlerはWebサーバとWebブラウザの間を繋ぐ、ただのプロキシツールです。Compat Inspectorをボタン一つで起動できるようにするには、個別に設定が必要です。本章では、この設定方法について説明します。

f:id:furoshiki0223:20140102121909p:plain

先述した通り、Compat InspectorはただのJavaScriptライブラリです。HTMLドキュメント上から呼び出せるよう、Scriptタグで参照させることで利用可能になります。Fiddlerのプロキシとしての特性、機能を活用して、検証対象のWebページにScriptタグを埋め込ませてWebブラウザに読み込ませます。

簡単に「Scriptタグを埋め込む」とは言っていますが、この処理は地味に複雑だったりします。というのは、埋め込みの条件は「全てのScriptタグの読み込みが終わった後」とか、コンテンツタイプはこれじゃないといけないとか、色々な判定処理をFiddler側にスクリプトとして記述し、読みこませなくてはいけないからです。

しかし臆する必要はありません。必要なコードスニペットは、こちらで用意しています。以下の手順に従い、設定ファイルへコードスニペットを埋め込みましょう。

メニューバー「Rules」→「Customize Rules…」
f:id:furoshiki0223:20140102120722p:plain

メモ帳で開かれた「CustomizeRules.js」内に、こちらのカズタマイズ済みの設定ファイルを丸々コピー&ペーストして下さい。ファイルを保存したら、設定は完了です。(※ Fiddler 2.4.5.8でテスト済みです。)

★ インターネット接続できない環境下での利用方法

SIの案件の場合、インターネット接続が禁止された環境下で検証作業を行わなくてはいけないこともあるでしょう。この場合、先ほど丸ごとコピー&ペーストした「Customize Rules…」の内容で、一番下にある以下の行に修正が必要です。

    // Perform the injection at the detected location
    oSession.utilSetResponseBody(
        sBody.Insert(pos, "<script src='http://ie.microsoft.com/testdrive/HTML5/CompatInspector/inspector.js'></script>")
    );
}
}

上記の「sBody.Insert」で指定されているsrcのURLの内容をダウンロードし、イントラネット内のアクセス可能なサーバへ配置し、URLをそちらへ向けて下さい。Compat Inspectorの本体ファイルである「inspector.js」は、インターネット上のリソースへアクセスしない仕様であるため、ローカルで検証処理を完結させることが可能です。

3. Compat Inspectorの実行

2章の設定が正常に完了している場合、メニューバー「Rules」に「Use Compat Inspector」が追加されています。チェックを入れると、Compat Inspectorが有効化します。

有効化している状態で、早速Webサイトへアクセスしてみましょう。IE、Chrome、Firefox、どれでも良いので、ブラウザを起動してテスト対象ページへアクセスして下さい。

一点、注意が必要です。「http://furoshiki.hatenadiary.jp/」のように省略形でなく「http://furoshiki.hatenadiary.jp/test」のようにアクセス先のページを明示するようにして下さい。どうも前者のようなURL表記だと、動作しないようです。画像のように、赤・黄・青の枠と数字が表示されれば成功です。

枠内をクリックしてみましょう。以下のような一覧が表示されます。

f:id:furoshiki0223:20140102232033p:plain

どのような対処が必要かについては、参照されたリンクの内容を確認することになります。リンクで参照されているドキュメントはデフォルトでは英語ですが、「/en-us/」を「/ja-jp/」に修正すると日本語化されます。

http://msdn.microsoft.com/en-us/library/ie/ff986088(v=vs.85).aspx
↓
http://msdn.microsoft.com/ja-jp/library/ie/ff986088(v=vs.85).aspx

f:id:furoshiki0223:20140106110326p:plain

4. 問題に対する対応手順

各色には、以下の意味を持たされています。

Info 許容状態。ユーザによって許容した状態。JSライブラリの検出も行う。
Warning 警告状態。将来的に動かない可能性があり、修正が求められる。
Error エラー状態。既に動かない、致命的な問題を持つ状態。

青色は許容状態なので、カウントは不要です。jQueryなどのJSライブラリの検出も行います。品質をチェックする際に、参考程度に確認して下さい。黄色赤色は対処が必要な項目です。対処としては、以下2種類のワークフローをCompat Inspectorが想定しています。

  1. 対策を行わない。無視する。許容する。
  2. 対策を行う。ソースコードに修正を加える。

★ 1. 対策を行わない。

対策を行わない場合、Infoステータスへ遷移させ、青色に変えます。右の画像にもある通り、Verify用のチェックボックスが付いているため、ここにチェックを入れます。この状態でWebページのリロードを行うと、黄色や赤色は、青色に状態を変えます。

もちろんですが、対策を行わないのはリスクを伴うため、有識者と相談し、この対処が正しいか確認を行う必要があります。

★ 2. 対策を行う。

対策を行う場合は、デバッグ作業を経て動作を確認しながらソースコードの変更を行う必要があるでしょう。

Compat Inspectorにはこれを補助する機能があります。Debugのチェックボックスにチェックを入れて下さい。

F12開発者ツールで確認すると、問題箇所に「debugger」という文字列が埋め込まれています。これはブレークポイントを表す文字列で、開発者ツールを起動している場合は、JavaScriptの処理がここで一旦停止します。

5. 本当にIE独自実装は全て排除すべきなのか?

インターネット向けのサービスの場合、IE8以下のWebブラウザに対応が求められる場合があります。IE8以下は、Microsoft自身も独自実装無くして実装できないことを、暗に認めてしまっている世代のWebブラウザです。実際にCompat Inspectorは、IE8以下では動作できない仕様となっています。

IE独自機能をどうしても必要とする場合、jQueryやBootstrapなどを利用すれば動作の差を多少は吸収することができるはずですが、完全でもありません。悩ましい問題です。Compat Inspectorは、あくまでWeb標準を使うことが正義という前提であり、今というよりこれからの技術とも捉えることができます。

Webアプリのパフォーマンス改善をWeb標準で行う方法、まとめ

HTML5 Advent Calendar 2013」の24日目の記事です。

Webアプリのパフォーマンス改善と言えば、JavaScriptやDOMアクセスなど、既存の技術ベースな改善手法を想像する方も多いでしょう。最近では、こうした改善のあり方を、別の視点からもう少し広げようというアイデアが存在感を持ち始めています。それは「Web標準」です。

そこで今回、Web標準側でできるWebアプリのパフォーマンス改善について、掻い摘んで紹介します。全てを説明となるとキリがないので、キーワードを中心とさせて頂きます。最近になって、結構実用化が進んできているので、悩んだ時には試してみる価値はあるでしょう。

1. リソースを先に読み込む

linkタグにてURLなどを指定することで、これから先に読み込ませる可能性が高いWebページのリソースを予め読み込むWeb標準があります。ニュースサイトでは次のページを先読みしたり、ログイン画面を表示中にフレームワークの本体などのファイル容量の大きなスクリプトファイルを読み込むなど、柔軟なリソース操作でかなりのパフォーマンス改善が期待できます。

ここでは、3つの先読み技術を紹介します。

  • prerender : 1つのページの全てのリソースを先読みする。
  • prefetch : 単独リソースの先読み。JSファイルやimgファイルなど。
  • dns-prefetch : DNSの名前解決の先読み。(※今のところはベンダ独自仕様)

▼ サンプルコード

<!-- 次のページの読み込み -->
<link rel="prerender" href="./?page=2" />
<!-- 近いうちに必要になる大きいリソースの先読み -->
<link rel="prefetch" href="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js" />
<!-- 近いうちに必要になるDNSの名前解決 -->
<link rel="dns-prefetch" href="http://example.com/" />

上記は、iPhoneを除けばスマートデバイス(AndroidやWindows8.1)では既に実用段階に入っている点、実装されていないブラウザでは無視される点、フォールバックが難しいという点、パフォーマンスが劇的に改善されるという4つのポイントから、2014年はかなり広がりを見せると睨んでいます。

2. リソースの読み込み順序を操作する

resource-priorities(ネットワークの優先順位付け)」は、CSSファイルやimgファイルなど、ロードが必要なリソースに対して、優先付けを行うためのWeb標準です。Webページを表示する際に、画面に表示されない箇所を後で読み込ませるといった活用方法があります。画像が多いようなページでは、初期表示のパフォーマンスを改善さることができるでしょう。ただ、そこそこ複雑性の高いページでないとその改善が見えてこないため、デバッグは苦労するかもしれません。

ステータスとしてはまだまだ議論中のワーキングドラフトという状況ですが、Chrome(安定しているかは不明)やIE(lazyloadのみ)では既に部分的な実装が始まっています。

  • lazyload : 他のリソースよりも遅れて読み込む
  • postpone : 画面上に表示されるまで読み込まない

▼ 例1:タグのプロパティから扱う場合

<img src="./img/hoge.png" lazyload />
<img src="./img/fuga.png" postpone />

▼ 例2:CSSから扱う場合

img.hoge { resource-priorities : lazy-load; }
img.fuga { resource-priorities : postpone; }

▼ 例3:JavaScriptから扱う場合

var img = new Image();
img.setAttribute('lazyload');
img.src = "hoge.png";

実装が部分的で利用シーンも限られるため、当面の間は、imgタグなどに限定すれば、jQuery.lazyLoadで代替すると良いように思えます。Scriptタグについては、defereで代替できる上に、依存関係解決(CommonJS/requireJS)など別の方向性で議論が進んでいるため、あまり役に立たないかもしれません。

3. リソースのキャッシュを操作する

AppCache」は、Webページのリソースのキャッシュを制御するWeb標準です。標準化の雲行きが怪しくなってはいますが、サーバとクライアント間の通信量そのものを減らすことができるため、パフォーマンス改善に役立ちます。(2014.5.8 : AppCacheの問題点を改善した、「Service Workers」というWeb標準が公開されました。)

AppCacheが無理でも、昔からブラウザは高度なキャッシュ機能を有しており、HTTPヘッダでのキャッシュ制御でもそれなりの改善が行えます。HTTPヘッダだと、以下の項目が挙げられます。

  • Expires : コンテンツの有効期限を指定します
  • Cache-Control : クライアントのキャッシュ機能を制御します
  • ETag : サーバ側でクライアントのキャッシュの新しさを判定します

(※参考 : RFC 2616 - W3C )

4. Webページの非活性を検出する

すごく地味ですが、Webページの非活性を検出して、なんとかしようというアイデアもあります。ブラウザのタブで、非活性な状態の時にはサーバイベント取得のポーリング数を抑えるなど、バックグラウンド処理を減らし、CPUやネットワークなどのハードウェアリソースの消費を抑え、パフォーマンスを改善しようというものです。

Page Visibility API」は、2013年5月に1版、10月に2版までW3C勧告化が完了し、IEは10から、ChromeもFirefoxも既に実装済みの実用性がかなり高いWeb標準です。このAPIを利用して、非活性を検出しWebアプリの振る舞いを変えることになります。

▼ サンプル

document.addEventListener('visibilitychange', function(){
  if ( document.hidden ) {
    // ポーリング数を減らす処理
  } else {
    // ポーリング数を増やす処理
  }
}, false);

5. 通信プロトコルを最適化する

★ WebSocket/ServerSentEvents

Webページからの非同期通信の最適化です。ファイアウォール超などの問題を抱えてはいますが、最近はJavaや.NETなどの開発において、アーキテクチャ進化のベースになっているという印象を受けます。Project AvatorにせよSignalRにせよ、リソース同期やRPCを実現するための手段として活用されていることから、今後も目を離せません。

★ SPDY/HTTP2.0

HTTP1系の通信の悪いところを補った新しいプロトコルです。SPDYについてはモダンブラウザで対応が進んでいますが、IEは11からのサポートです。

★ gzip

コンテンツを圧縮することにより、通信コストを減らすという最適化方法です。古い時期から採用されており、IEも6から対応しているのですが、諸々の事情によりIE7以上で利用するほうが良いでしょう。

6. 物理パフォーマンス/時間を検出し最適化する

パフォーマンスの計測を行うためのJavaScriptのAPIは、かなりの数の標準があり、ステータスとしても今の時点で既にW3C標準に進んでいるものも存在します。キーワードベースで並べると、以下の通りです。

IE10+やChromeでサポートされますが、Firefoxは全体的に微妙な印象です。上記のAPIは、単純に性能測定をするだけに用途は限られず、例えば「Timing control for script-based animations」はゲーム開発におけるフレーム処理に活用されます。(・・・実態としては、環境依存の動作なのでそうもいかないという問題を抱えているのですが、この話はまた今度。)

Navigation TimingやResource Timingは、パフォーマンスの改善ポイントを探すためのWeb標準ですが、ユーザのリアルなWebページ表示速度を取得できる(Real User Monitoringと呼びます)という点では、Webにとって新しい技術と言えます。プラットフォームも増え、機能/動作検出な開発手法が広がると、パフォーマンスの面での検出に活用され幅広い利用方法が模索されそうな気がしています。性能へ配慮したフォールバックみたいなものが、このあたりの標準から生まれるかもしれません。

Navigation Timingについては、HTML5 Experts.jp様にて使い方を解説しています

7. パフォーマンス情報の蓄積

最後に、6で取得した、Webページを表示した際のパフォーマンス情報を、サーバ側へ送信するためのWeb標準です。ユーザの情報を取得する手段としては、Web Beaconというやや泥臭い手法もありますが、JavaScript上で得られる情報が多くなった昨今、より踏み込んだ情報をサーバへ送るための仕組みが求められます。こうした背景から生み出されたのが、「Beacon」というWeb標準です。ただ、中身は今のところ、XMLHttpRequestでもできる簡単なことです。

凄く多いですね。多すぎて、1年後には色んな仕様が全く別物に姿を変えていそうな気がします。ただ、Webプラットフォームのパフォーマンスの悩みは、少し作り込みが複雑なものを作ったことある方なら、必ずしも通っている道のように思えます。

もっと充実化して、改善が進むと良いですね。

無料でIEのマルチバージョンテスト「Modern.IE」開発での利用時の注意点

Microsoftは、6以降の全てのIEの動作をテストできる手段として、「Modern.IE」というサービスを提供しています。

タイトルでは無料と言っていますが、実際には一部のサービスのみが無料となっています。

本来なら有償のサービスを売り込みたいところなのでしょうが、残念なことに無料のサービスの方が、SI業界の人間であれば待ってましたと言わんばかりの機能性を兼ね備えてしまっています。そのサービスとは「Modern.IE VM」です。

Modern.IE VMとは?

Modern.IE VMとは、90日間無償で利用できる、IEテスト用のVMイメージです。ライセンスが切れても、正規の手順を踏めば再びライセンスされるため、この点で単なる試用版とは異なる特性を持っているように思えます。Windows版の場合、以下の仮想化製品のVMを提供しています。

  • Hyper-V(Windows Server 2008 R2 SP1以上)
  • Hyper-V(Windows Server 2012 以上/Windows 8 Pro)
  • Virtual PC (Win7用)
  • Virtual Box
  • VMWare Player

Webコンテンツは、「OS」+「ブラウザの種類/バージョン」+「ブラウザの制御パラメータ」の3つの組み合わせにより、動作が異なるという特徴を持っていますが、Modern.IE VMではOSとIEのバージョンの組み合わせによる再現性を、ある程度までは網羅できるような状態で提供しています。具体的には、以下のセットです。(2013年12月31日現在)

IE6 IE7 IE8 IE9 IE10 IE11
Windows XP Professional SP3 - - -
Windows Vista Enterprise SP2 - - -
Windows 7 Enterprise - -
Windows 8 Enterprise - - - - -
Windows 8.1 - - - - -

※ ◯=有り、✕=無し、-=動作不可

ダウンロードは、以下のURLへアクセスし、ページ中央の「Mac、Linux、Windows 用の仮想マシンをダウンロードします。」というタイトルのすぐ下で、セレクトボックスの内容を選択しながら進めていきます。
Modern.IE VM - http://loc.modern.ie/ja-jp/virtualization-tools#downloads

f:id:furoshiki0223:20131212224809p:plain
※ 左は仮想化ソフト自体を動かすOS。右は仮想化ソフトの種類です。

ダウンロードファイルのサイズが大きい場合は、分割されています。「.exe」で終わるファイルを実行し、ファイルを一つに繋げる必要があります。なお、Windows XP系VMは日本語が表示できないので、Windows XPのインストールイメージファイルを用意し、ランゲージパックを取得しインストール必要があります。

一つのOS上で、2バージョン以上のIEがテストできる

わざわざ複数のWindowsのマシンを起動しなくても、異なるOS、異なるバージョンのIEがテスト出来るというのは、環境の多様化が進んだ現在において必須のツールでしょう。特に、IE8を動作対象ブラウザにしてしまった場合、IE8とIE9以上の2バージョンでテストしないといけないため、使わないという道すら残されていないように思えます。(→理由がわからない方は、こちらの記事をご覧下さい)

ただ、業務系システムのプロジェクトだと、やはり問題は色々出てきます。まず、セキュリティソフトの入っていないOSを、例え仮想マシン上とはいえ、動作させることを許してくれるかどうか。また、ユニットテストのようなIDEがもろに動いているようなフェーズでは、メモリが不足し動作が困難になるかもしれません。

なんだかんだ言っても、JUnitを扱うようなノリでさらっとRFPやらシステム提案書に書けるほど簡単で無いのがこのサービスの難しい所です。色々なリスクを抱えつつも、そのコストパフォーマンスの高さからどうにかしてでも使いたくなる、いかにもありがちなジレンマに陥っています。

利用時の注意点

ここからは、Modern.IE VMの商用利用時の注意点についてまとめます。 なお、参考にしているライセンスは、2013年7月22日現在のものです。
(※参考 : license 2013-07-22 - Modern.IE )

リバースエンジニアリングするなとかリコンパイルするなとか、Microsoft製品全般に言える、基本的な部分については全て割愛しています。

★ テスト以外には使ってはいけません!

  1. テスト用途として利用することが許されます。
  2. 業務用のOSとして使ってはいけません。
  3. 日常利用するためのOSとして使ってはいけません。

※ 2番について利用許諾内の解釈が難しかったためMicrosoftに確認したところ、あくまで「テスト」という目的であれば、商用の開発プロセス内で組込み利用することが可能とのことです。つまり、普通のSIの開発のテストフェーズで利用する分には何も問題無いということです。

★ ライセンスは90日間です!

  1. VMのダウンロードを行うと、利用許諾に同意したものとみなします。
  2. ダウンロードしたVMイメージ、もしくは初期起動後の状態のスナップショットが、90日間だけライセンスが有効となります。
  3. ライセンスが切れても、再度ライセンスすることができます。(1回目が切れたから、2回目という使い方はOK。要は、同じVMを91日以上使うなという意味。ライセンスが切れると、そのVM内に含まれているデータを取り出すだけでもアウトとも読み取れますので、テストという特性上注意が必要ですね。)
  4. アクティベーションを促されますが、アクティベーションしてはいけません。(プロダクトキーとか入れないで使ってくれという意味です。)

※ 上記、2と3についてはMicrosoftへ確認し発覚した点の共有です。

★ 物理マシンに1台までです!

  1. VMは一度に一人しか利用できません。一人に対して、一つのOS一つのハードウェアでしか使ってはいけません。
  2. 物理マシン上でしか利用してはいけません。
  3. ストレージがケーブル接続されているコンピュータのハードウェアに限ります。
  4. ハードウェアパーティションで区切られたもの、ブレードPCも1台とみなします。
  5. リモートアクセスは許可されています。(※XP/Vista/7/8系個別で定義されており、全てのライセンスで許容されている模様。)

※ このあたりは、シンクライアント環境下の開発のまとめです。一つのハードウェア上に複数VM動かして良いのかという点については、文章からはあまり読み取りにくい感じです。アウトなニュアンスに見えます。

UNIX系環境で楽してダウンロードする方法

wgetで、分割されたファイルを一括ダウンロードする方法もあります。各VMのダウンロードまとめに、ダウンロード先が記述されている「.txt」で終わるテキストファイルがあるので、これを直接指定すれば楽できます。

f:id:furoshiki0223:20131218025719p:plain

wget –i https://az412801.vo.msecnd.net/.../IE8.Win7.For.LinuxVirtualBox.txt

>> Webシステム・ガイドライン集

IE11のX-UA-Compatibleの使い方/動作仕様

IE11では、X-UA-Compatibleという制御パラメータを利用し、過去のWebブラウザの機能をエミュレートさせることができます。

本記事では、X-UA-Compatibleの利用方法について解説します。

  1. 動作の仕様
  2. 設定方法
    1. HTMLドキュメント内にX-UA-Compatibleを追加する
    2. ApacheでHTTPレスポンスヘッダにX-UA-Compatibleを追加する
    3. IISでHTTPレスポンスヘッダにX-UA-Compatibleを追加する

1. 動作仕様

  • IE=EmulateIE11 : 常にIE11モードとして動作する。
  • IE=EmulateIE10 : 常にIE10モードとして動作する。(※製品不具合)
  • IE=EmulateIE9 : DOCTYPE宣言に応じて、IE9モードかQuirksモード(IE5)を選択する。
  • IE=EmulateIE8 : DOCTYPE宣言に応じて、IE8モードかQuirksモード(IE5)を選択する。
  • IE=EmulateIE7 : DOCTYPE宣言に応じて、IE7モードかQuirksモード(IE5)を選択する。
  • IE=11 : 必ずIE11モードを選択する。
  • IE=10 : 必ずIE10モードを選択する。
  • IE=9 : 必ずIE9モードを選択する。
  • IE=8 : 必ずIE8モードを選択する。
  • IE=7 : 必ずIE7モードを選択する。
  • IE=5 : 必ずIE5モードとして動作する。

>> IE10のDOCTYPEスイッチによるStandard/Quirksモードの切り替え一覧表

2. 設定方法

X-UA-Compatibleの設定は、HTMLドキュメント上で設定するか、HTTP レスポンスヘッダで設定するかのどちらかを選択できます。

★ HTMLドキュメント内にX-UA-Compatibleを追加する

HTMLドキュメント内で記述する場合は、head要素内の比較的最初で以下を定義します。

<meta http-equiv="X-UA-Compatible" content="IE=11">

★ ApacheでHTTPレスポンスヘッダにX-UA-Compatibleを追加する

RHEL/CentOS/FedoraでApache HTTP Serverを利用している場合は、「/etc/httpd/httpd.conf」にて、一番最後に以下の内容を追記して下さい。

LoadModule headers_module modules/mod_headers.so
<IfModule headers_module>
   Header set X-UA-Compatible: IE=11
</IfModule>

Apacheに「mod_headers.so」がバンドルされていない場合はエラーになります。予め、インストールして下さい。

★ IISでHTTPレスポンスヘッダにX-UA-Compatibleを追加する

MicrosoftのWindows系OSで「インターネット インフォメーション サービス(IIS)」を利用している場合は、以下の手順になります。

「コンピュータの管理」→「インターネット インフォメーション サービス(IIS) マネージャー」
f:id:furoshiki0223:20131112210814p:plain

「HTTP応答ヘッダー」
f:id:furoshiki0223:20131112210923p:plain
表示内で右クリック、「追記」を左クリック
f:id:furoshiki0223:20131112211023p:plain
「名前(N):」へ「X-UA-Compatible」、「値(V):」へ「IE=11」
f:id:furoshiki0223:20131125014426p:plain

IE10のX-UA-Compatibleの使い方/動作仕様

IE10では、X-UA-Compatibleという制御パラメータを利用し、過去のWebブラウザの機能をエミュレートさせることができます。

本記事では、X-UA-Compatibleの利用方法について解説します。

  1. 動作の仕様
  2. 設定方法
    1. HTMLドキュメント内にX-UA-Compatibleを追加する
    2. ApacheでHTTPレスポンスヘッダにX-UA-Compatibleを追加する
    3. IISでHTTPレスポンスヘッダにX-UA-Compatibleを追加する

1. 動作仕様

  • IE=EmulateIE10 : DOCTYPE宣言に応じて、IE10モードかQuirksモード(IE5)を選択する。
  • IE=EmulateIE9 : DOCTYPE宣言に応じて、IE9モードかQuirksモード(IE5)を選択する。
  • IE=EmulateIE8 : DOCTYPE宣言に応じて、IE8モードかQuirksモード(IE5)を選択する。
  • IE=EmulateIE7 : DOCTYPE宣言に応じて、IE7モードかQuirksモード(IE5)を選択する。
  • IE=10 : 必ずIE10モードを選択する。
  • IE=9 : 必ずIE9モードを選択する。
  • IE=8 : 必ずIE8モードを選択する。
  • IE=7 : 必ずIE7モードを選択する。
  • IE=5 : IE5 quirksモードとして動作する。(※IE10の通常のQuirksモードはIE5とは互換性がないため、特殊なQuirksモードが動作する。)

>> IE10のDOCTYPEスイッチによるStandard/Quirksモードの切り替え一覧表

2. 設定方法

X-UA-Compatibleの設定は、HTMLドキュメント上で設定するか、HTTP レスポンスヘッダで設定するかのどちらかを選択できます。

★ HTMLドキュメント内にX-UA-Compatibleを追加する

HTMLドキュメント内で記述する場合は、head要素内の比較的最初で以下を定義します。

<meta http-equiv="X-UA-Compatible" content="IE=10">

★ ApacheでHTTPレスポンスヘッダにX-UA-Compatibleを追加する

RHEL/CentOS/FedoraでApache HTTP Serverを利用している場合は、「/etc/httpd/httpd.conf」にて、一番最後に以下の内容を追記して下さい。

LoadModule headers_module modules/mod_headers.so
<IfModule headers_module>
   Header set X-UA-Compatible: IE=10
</IfModule>

Apacheに「mod_headers.so」がバンドルされていない場合はエラーになります。予め、インストールして下さい。

★ IISでHTTPレスポンスヘッダにX-UA-Compatibleを追加する

MicrosoftのWindows系OSで「インターネット インフォメーション サービス(IIS)」を利用している場合は、以下の手順になります。

「コンピュータの管理」→「インターネット インフォメーション サービス(IIS) マネージャー」
f:id:furoshiki0223:20131112210814p:plain

「HTTP応答ヘッダー」
f:id:furoshiki0223:20131112210923p:plain
表示内で右クリック、「追記」を左クリック
f:id:furoshiki0223:20131112211023p:plain
「名前(N):」へ「X-UA-Compatible」、「値(V):」へ「IE=10」
f:id:furoshiki0223:20131124004901p:plain

IE9のX-UA-Compatibleの使い方/動作仕様

IE9では、X-UA-Compatibleという制御パラメータを利用し、過去のWebブラウザの機能をエミュレートさせることができます。

本記事では、X-UA-Compatibleの利用方法について解説します。

  1. 動作の仕様
  2. 設定方法
    1. HTMLドキュメント内にX-UA-Compatibleを追加する
    2. ApacheでHTTPレスポンスヘッダにX-UA-Compatibleを追加する
    3. IISでHTTPレスポンスヘッダにX-UA-Compatibleを追加する

1. 動作仕様

  • IE=EmulateIE9 : DOCTYPE宣言に応じて、IE9モードかQuirksモード(IE5)を選択する。
  • IE=EmulateIE8 : DOCTYPE宣言に応じて、IE8モードかQuirksモード(IE5)を選択する。
  • IE=EmulateIE7 : DOCTYPE宣言に応じて、IE7モードかQuirksモード(IE5)を選択する。
  • IE=9 : 必ずIE9モードを選択する。
  • IE=8 : 必ずIE8モードを選択する。
  • IE=7 : 必ずIE7モードを選択する。
  • IE=5 : Quirks(IE5の互換動作)モードとして動作する。

>> IE9のDOCTYPEスイッチによるStandard/Quirksモードの切り替え一覧表

2. 設定方法

X-UA-Compatibleの設定は、HTMLドキュメント上で設定するか、HTTP レスポンスヘッダで設定するかのどちらかを選択できます。

★ HTMLドキュメント内にX-UA-Compatibleを追加する

HTMLドキュメント内で記述する場合は、head要素内の比較的最初で以下を定義します。

<meta http-equiv="X-UA-Compatible" content="IE=9">

★ ApacheでHTTPレスポンスヘッダにX-UA-Compatibleを追加する

RHEL/CentOS/FedoraでApache HTTP Serverを利用している場合は、「/etc/httpd/httpd.conf」にて、一番最後に以下の内容を追記して下さい。

LoadModule headers_module modules/mod_headers.so
<IfModule headers_module>
   Header set X-UA-Compatible: IE=9
</IfModule>

Apacheに「mod_headers.so」がバンドルされていない場合はエラーになります。予め、インストールして下さい。

★ IISでHTTPレスポンスヘッダにX-UA-Compatibleを追加する

MicrosoftのWindows系OSで「インターネット インフォメーション サービス(IIS)」を利用している場合は、以下の手順になります。

「コンピュータの管理」→「インターネット インフォメーション サービス(IIS) マネージャー」
f:id:furoshiki0223:20131112210814p:plain

「HTTP応答ヘッダー」
f:id:furoshiki0223:20131112210923p:plain
表示内で右クリック、「追記」を左クリック
f:id:furoshiki0223:20131112211023p:plain
「名前(N):」へ「X-UA-Compatible」、「値(V):」へ「IE=9」
f:id:furoshiki0223:20131124040219p:plain

IE8のX-UA-Compatibleの使い方/動作仕様

IE8では、X-UA-Compatibleという制御パラメータを利用し、過去のWebブラウザの機能をエミュレートさせることができます。

本記事では、X-UA-Compatibleの利用方法について解説します。

  1. 動作の仕様
  2. 設定方法
    1. HTMLドキュメント内にX-UA-Compatibleを追加する
    2. ApacheでHTTPレスポンスヘッダにX-UA-Compatibleを追加する
    3. IISでHTTPレスポンスヘッダにX-UA-Compatibleを追加する

1. 動作仕様

  • IE=EmulateIE8 : DOCTYPE宣言に応じて、IE8モードかQuirksモード(IE5)を選択する。
  • IE=EmulateIE7 : DOCTYPE宣言に応じて、IE7モードかQuirksモード(IE5)を選択する。
  • IE=8 : 必ずIE8モードを選択する。
  • IE=7 : 必ずIE7モードを選択する。
  • IE=5 : Quirks(IE5の互換動作)モードとして動作する。

>> IE8のDOCTYPEスイッチによるStandard/Quirksモードの切り替え一覧表

2. 設定方法

X-UA-Compatibleの設定は、HTMLドキュメント上で設定するか、HTTP レスポンスヘッダで設定するかのどちらかを選択できます。

★ HTMLドキュメント内にX-UA-Compatibleを追加する

HTMLドキュメント内で記述する場合は、head要素内の比較的最初で以下を定義します。

<meta http-equiv="X-UA-Compatible" content="IE=8">

★ ApacheでHTTPレスポンスヘッダにX-UA-Compatibleを追加する

RHEL/CentOS/FedoraでApache HTTP Serverを利用している場合は、「/etc/httpd/httpd.conf」にて、一番最後に以下の内容を追記して下さい。

LoadModule headers_module modules/mod_headers.so
<IfModule headers_module>
   Header set X-UA-Compatible: IE=8
</IfModule>

Apacheに「mod_headers.so」がバンドルされていない場合はエラーになります。予め、インストールして下さい。

★ IISでHTTPレスポンスヘッダにX-UA-Compatibleを追加する

MicrosoftのWindows系OSで「インターネット インフォメーション サービス(IIS)」を利用している場合は、以下の手順になります。

「コンピュータの管理」→「インターネット インフォメーション サービス(IIS) マネージャー」
f:id:furoshiki0223:20131112210814p:plain

「HTTP応答ヘッダー」
f:id:furoshiki0223:20131112210923p:plain
表示内で右クリック、「追記」を左クリック
f:id:furoshiki0223:20131112211023p:plain
「名前(N):」へ「X-UA-Compatible」、「値(V):」へ「IE=8」
f:id:furoshiki0223:20131124033723p:plain

IE11のEmulateIE10(X-UA-Compatible)でDOCTYPEスイッチに不具合がある(→仕様でした)

(※ 本ドキュメントは古い情報です。正確な仕様は、こちらを参照して下さい。)

IE10までは、「X-UA-Compatible」に対して、「IE=EmulateIE」で指定された対象バージョンのドキュメントモードでは、DOCTYPEスイッチの条件に従いQuirksモードへの切り替えを行っていました。

「IE=EmulateIE10」と指定した場合、Microsoftの公開している仕様に準ずるなら、以下のURLのDOCTYPEスイッチの条件に従う必要があるはずです。

IE10のDOCTYPEスイッチによるStandard/Quirksモードの切り替え一覧表

↓ Microsoftの提供するEmulateIEの仕様
X-UA-Compatibility Meta Tag and HTTP Response Header - Microsoft Developer Network

しかしIE11では、「IE=EmulateIE10」の場合に限り、DOCTYPE宣言を確認せず常にIE10として動作するという不具合があります。これを改善するには、Quirksモードとして動作が必要なWebコンテンツに対して、「IE=EmulateIE9」以下を指定するか「IE=5」と直接指定することで対処する必要があります。

※2013/11/24 : この不具合は、筆者がMicrosoft Connectへ報告しています。
IE11 - BUG / DOCTYPE switch does not work, when I use "IE=EmulateIE10". - Microsoft Connect
※2013/11/27 : えむけい氏の指摘により、本動作は仕様であることが確認されました。

IE10のDOCTYPEスイッチによるStandard/Quirksモードの切り替え一覧表

IE10には、古いIEの動作とHTML5との相互運用を可能としたレンダリングエンジンとして動作するQuirksモードと、最新のレンダリングエンジンとして動作するStandardモードがあります。HTMLドキュメントの一番上でのDOCTYPE宣言を行うことにより切り替えを行います。

IE10の場合、「X-UA-Compatibe」へ「IE=EmulateIE」というパラメータを与えることにより、過去のIEの動作を再現させることができます。EmulateIEは、5/7/8/9の3種類を持っています。5を指定すると常に「Quirksモード」として動作しますが、7/8/9の場合、DOCTYPE宣言の内容によって「Quirksモード」か「IE7/8/9 Standardモード」のどちらかへ遷移します。

▼ HTMLドキュメント内で宣言する場合

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" />

▼ HTTP Response Headerで指定する場合

X-UA-Compatible:IE=EmulateIE9

EmulateIEを指定した場合もそうでない場合も、Quirksモードへの判定条件は変化しません。このため、本記事ではEmulateIEを指定している状態で、IE7/8/9 Standardモードになる場合も「Standardモード」として扱います。

DOCTYPEスイッチ一覧

Quirksモードを「Q」、Standardモードを「S」と表記します。

HTML1系

Q 無し

HTML2系

Q <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
Q <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
S <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML i18n//EN">

HTML3系

Q <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN">
Q <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
Q <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">

HTML4系

Q <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
S <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
Q <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
S <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
S <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
S <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

XHTML1系

S <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
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 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
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 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
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">

HTML5系

S <!DOCTYPE html>

IE5 quirksモードについて

IE6〜10までのQuirksモードはIE5の動作を再現するためにありましたが、IE10からは方針を変更し、HTML5標準との相互運用を行うための仕様変更が行われました。このため、公式的にIE5とは互換性がなくなっています。

代替の手段として、IE10にはIE5の動作を再現させる「IE5 quirksモード」という別のドキュメントモードを用意しています。これを利用すれば、以前のQuirksモードと同じ動作を再現させることが可能です。

対策には、以下のリンクを参照して下さい。

>> IE6〜9とIE10とでQuirksモードの動作が違う、どうすれば解決できるか?

IE9のDOCTYPEスイッチによるStandard/Quirksモードの切り替え一覧表

IE9には、IE5の動作を再現させるQuirksモードと、最新のレンダリングエンジンとして動作するStandardモードがあります。HTMLドキュメントの一番上でのDOCTYPE宣言を行うことにより切り替えを行います。

IE9の場合、「X-UA-Compatibe」へ「IE=EmulateIE」というパラメータを与えることにより、過去のIEの動作を再現させることができます。EmulateIEは、5/7/8の3種類を持っています。5を指定すると常に「Quirksモード」として動作しますが、7/8の場合、DOCTYPE宣言の内容によって「Quirksモード」か「IE7/8 Standardモード」のどちらかへ遷移します。

▼ HTMLドキュメント内で宣言する場合

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />

▼ HTTP Response Headerで指定する場合

X-UA-Compatible:IE=EmulateIE8

EmulateIEを指定した場合もそうでない場合も、Quirksモードへの判定条件は変化しません。このため、本記事ではEmulateIEを指定している状態で、IE7/8 Standardモードになる場合も「Standardモード」として扱います。

DOCTYPEスイッチ一覧

Quirksモードを「Q」、Standardモードを「S」と表記します。

HTML1系

Q 無し

HTML2系

Q <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
Q <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
S <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML i18n//EN">

HTML3系

Q <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN">
Q <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
Q <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">

HTML4系

Q <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
S <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
Q <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
S <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
S <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
S <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

XHTML1系

S <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
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 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
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 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
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">

IE7のDOCTYPEスイッチによるStandard/Quirksモードの切り替え一覧表

IE7には、IE5の動作を再現させるQuirksモードと、最新のレンダリングエンジンとして動作するStandardモードがあります。HTMLドキュメントの一番上でのDOCTYPE宣言を行うことにより切り替えを行います。

IE7からは、IE6まで問題になっていたXHTML1.0のDOCTYPE宣言の誤認識が解決されました。このため、XHTMLのDOCTYPE宣言を行っていたIE6のドキュメントは、IE7への以降時に動作に異常が生じることがあります。注意して下さい。

DOCTYPEスイッチ動作一覧表

Quirksモードを「Q」、Standardモードを「S」と表記します。

HTML1系

Q 無し

HTML2系

Q <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
Q <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
S <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML i18n//EN">

HTML3系

Q <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN">
Q <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
Q <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">

HTML4系

Q <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
S <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
Q <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
S <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
S <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
S <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

XHTML1系

S <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
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 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
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 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
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">

相互運用性対策は「ブラウザ/デバイス検出」から「機能/動作検出」へ

これまでWebシステム/サイトは、Webブラウザの種類でビューを切り替える「ブラウザ検出」という考え方が一般的でした。また、デスクトップ型かスマートデバイス型かをサーバで判断し、ビューを返す「デバイス検出」は、今もなお主流かと思います。

しかし最近、ブラウザの持つ機能や動作を検出して動作を切り替える「機能検出」「動作検出」という方法へシフトすべきという意見が広がっています。実際に現場でも、この設計指針へのシフトを検討している方もいるでしょう。

本記事では、「ブラウザ/デバイス検出型」と「機能/動作検出型」について、その重要性について解説します。

1. Webブラウザの持つ2レイヤーの概念

★ 1.1. レンダリングエンジンとOS

「機能/動作検出」の前に、まずWebブラウザの持つ2レイヤーの考え方について理解してみましょう。

Webブラウザには、HTMLドキュメントやCSS/JavaScriptファイルを読み込み、Webページを表示するレンダリングエンジンという機構が備わっています。

レンダリングエンジンはOSから見ると、他のアプリケーションとは変わらないただのプログラムです。しかしレンダリングエンジン側から見たOSは、WindowsにMAC、Linuxという異なるシステムであり、レンダリングエンジンはこれらのOSの持つ機能の中から極力同じことが出来るものを利用し、Webページの表示を行わなくてはいけません。

したがって、WebブラウザがHTMLドキュメントを読み込みWebページを表示する際、その動作は以下の2レイヤーに依存することになります。

f:id:furoshiki0223:20131118170607p:plain

レンダリングエンジンのソースコードの大半は、どのようなOSであっても同じものが利用されるため動作に違いは生じません。しかし、OSに依存するような機能を利用していた場合、OSごとに異なる動作にならざるえません。

2. OS・レイヤーの抱える問題

★ 2.1. alertから学ぶ、各WebブラウザのOSとの付き合い方

Chrome(WebKit)やFirefox(Gecko)は極力レンダリングエンジン側に処理を持たせ、OSは汎用的なAPIのみを利用しようという傾向があります。しかしIE(Trident)は、どちらかと言えばOSのAPIをフルに活用しようという傾向にあります。いかにもOSのAPIをラップしてそうな機能は、Webブラウザごとにやや異なる動作になります。

例えば、JavaScriptの「alert」というシンプルなAPIを確認するだけでも、各Webブラウザの持つ思想の違いが読み取れるでしょう。

f:id:furoshiki0223:20131116020551p:plain

alertは、Firefoxには閉じるボタンがありませんが、ChromeとIEにはあるという機能面での違いが生じています。デザインについて、FirefoxとChromeはOSによる差異は小さく独自のものを利用していますが、IEはWindowsXPか7かといったOSの種類によって、ウィンドウの形状に違いが生じます。

alertの場合、形状が異る程度で、目的としている機能は概ね達成されています。問題になることは無いでしょう。

★ 2.2. 名前解決から学ぶ、OSブランド間の差異

URLの考え方は、各OSごとに違いが生じています。

ハイパーリンクやお気に入りのクリックにより生じるドメイン名の名前解決ですが、MacOSのようなUNIX系のWebブラウザはSocketと呼ばれるAPIを利用します。対してWindows上のWebブラウザは全て、WinSock2というAPIを利用することになります。

SocketのAPIへ渡されたドメイン名は、DNSと呼ばれる名前解決の仕組みを利用してIPアドレスに解決されます。対してWinSock2は、DNSに加えてNBT(NetBIOS/WINS)という名前解決の仕組みも利用されることになります。Windowsの場合はActive Directory絡みの拡張も絡みますが、ドメイン名周りについて、Webブラウザの種類への依存は小さく、OSの種類への依存は大きいという状況です。

ドメイン名の扱いをOSごとに厳密にすると、MacOSは「DNSドメイン名」、WindowsOSは「フルコンピュータ名」と呼ばれる概念として扱われ、名前解決が行われます。同じChromeやFirefoxであっても、Windows版かMac版かでアクセスできるURLに差異が生じてしまいます。これは、WINSに依存した業務システムでは、問題になることがあります。

f:id:furoshiki0223:20131118174841p:plain

OSの持つ名前解決の仕組みが限られているが故に発生する、機能面での差異です。

Webブラウザの仕様はW3Cで標準化されていますが、その内容は「できること」が中心で、想定外の操作に対する動作の定義は、行われていないものが多いです。Web標準はあくまで、共通項を定義しているのに過ぎないのです。

★ 2.3. テキスト出力から学ぶ、OSのバージョン間差異

IEはWindowsのみとOSが限定されているから安全かと言えば、そういうものでもありません。Windowsは2000/XP(NT5系)からVista/7/8(NT6系)、そして8.1でも微妙に差があり、OSのバージョン間でも動作の違いが生じています。

Windowsのテキスト出力について、NT5系のWindowsの多くのフォントが可変幅だったのに対して、NT6系からメイリオと呼ばれる固定横幅が推奨されるようになりました。これに伴い、テキスト出力は固定幅に最適化されたような動作に変わりました。

レガシーIE向けに作られたWebシステム/サイトに多いのが、ピクセル単位での動作に依存したデザインです。以前よく見た事例としては、ポップアップウィンドウの幅とテキストの横幅が揃うことを前提としたレイアウトが問題になるケースです。

f:id:furoshiki0223:20131118185105p:plain

このシステムが開発されたのは単一ブラウザが当たり前なIE6時代なので、当時は全く問題にならなかったのでしょう。時代が変わりIE8へ移行しても、WindowsXPなのでまだ問題がありませんでした。しかし、Windows7+IE8へ移行というタイミングになって、突然問題が起こります。同じIE8なのに、レイアウトが崩れてしまうのです。

この事例は、ポップアップウィンドウというOS依存のAPIと、テキスト出力というOS依存の動作がダブルパンチになって効いてきています。

Webブラウザ依存のポップアップウィンドウを使うなんてのがそもそも良くないという意見もありますが、その点を差し置いても、レイアウトのデザインについては、どこまでがレンダリングエンジンでできて、どこからがOSなのかという点は理解する必要があります。そしてOSにより変化する機能は、何かしらの対策を講じなくてはいけないでしょう。

CSS3-UIには「text-overflow」という仕様がありますが、まさにこれはOS依存のテキスト幅に対しても、目的の機能をWebブラウザの機能だけで実現しようという取り組みです。Webブラウザの種類だけでなく、OSの種類でも機能の差異を吸収しようという取り組みがWeb標準では行われています。

3. レンダリングエンジン・レイヤーの抱える問題

★ 3.1. IEの互換表示機能の限界

Internet Explorerには、後方互換性を保つための「互換表示」という機能が備わっています。例えば、IE8であれば、IE5(Quirksモード)とIE7のレンダリングエンジンを内部で持っており、古いIEの独自機能を利用したコンテンツをそのまま維持しつつ、IEのバージョンアップを行えるという狙いがあります。
(※参考 : 互換表示一覧の概要 - Microsoft)

f:id:furoshiki0223:20131118193454p:plain

かつてIEには、CSS上でJavaScriptを動作させることができる、CSS Expresionsというアンチパターンがありました。古いコンテンツの多くは、この機能に依存していました。Webブラウザが新しいWeb標準に追いつけていない場合にも、CSS側で不足した機能を埋めることができたからです。CSS ExpressionsはIE8で既に、サポートが削除されています。
(※参考 : CSS Expressions のサポート終了について - Microsoft)

互換表示機能を使えば、IE8〜10のWebブラウザでもCSS Expressionsを利用することができます。古いコンテンツがネックになって、IEのバージョンアップができなくなるという問題を回避するために行われた対処です。既存資産の維持という目的であれば、互換表示機能は価値の高い機能でしょう。

しかし、2章の内容を読んだ人であれば、この動作には限界があるということがわかるはずです。「互換表示」が機能するのは、あくまでレンダリングエンジンの層に限定されるのです。OSをエミュレートするための機能を、Webブラウザは持ってはいません。

f:id:furoshiki0223:20131118194122p:plain

★ 3.2. 独自実装機能の限界

既に述べた通り、古いIEはかなり多くの独自機能を持ち、多くのコンテンツがこれに依存していました。Webブラウザ上で、.NET用のCLRが動作したり、豊富なActiveXのAPIや、Windows機能のラッパーじゃないかと思えるような機能がゴロゴロと付いていました。

これにより、Web制作/開発者側の苦労は大きくなりました。IEは古いバージョンも多くシェアを占める上、独自動作は各バージョン間でも違いが生じているため、バージョンベクタと呼ばれる機能を利用して、各バージョンごとの動作差異を吸収しなくてはいけません。
(※参考 : バージョン ベクタ - Microsoft )

また、独自実装に走ったIEと、標準準拠に走った別のWebブラウザとで、ブラウザ検出によるビューの切り替えを行わなくてはいけません。制作/開発者は、IE特化のビューをわざわざ用意する必要があったのです。ASP.NETには、これを想定した機能まで提供されていました。ブラウザごとに、マークアップを分けるのは公式に認められた手段と化していたのです。
(※参考 : ブラウザ定義ファイルのスキーマ -MSDN )

しかしIEはバージョン8から、独自実装からWeb標準への準拠という方針へシフトし、状況は徐々に改善されました。
(※参考 : Microsoft Expands Support for Web Standards - Microsoft)

これまで安定した実装を得るために独自機能へ走っていたのが、ベンダプレフィックスにより試験機能を明確化することで、Web標準への準拠するようになりました。
(※参考 : Microsoft CSS Vendor Extensions - Microsoft)

こうした取り組みが実り、IEはバージョン固有機能のしがらみから開放され、IE9以降あたりから独自実装の少ない汎用的なコンテンツを作ることができるようになりました。

4. HTML5時代のWeb開発/制作の指針

★ 4.1. 「ブラウザ検出」→「機能/動作検出」

IE9では、Microsoftが公式に公開している互換性クックブックというドキュメントの中で「機能検出」「動作検出」という指針でWebコンテンツを制作/開発するよう促しています。
(※参考:機能検出と動作検出の使用 - Microsoft)

IE10からはMicrosoftも自信を持っており、特定のIEのバージョンでのみHTMLタグを有効にさせるという条件付きコメント機能のサポートを削除しました。
(※参考:条件付きコメントがサポートされなくなった - Microsoft)

またIE11からは、ユーザエージェントからMSIEの文字をなくしたことで、サーバ・JavaScript上から、ブラウザの種類の検出が困難になりました。
(※参考:IE11 の互換性の変更点 - Microsoft)

これらの背景を踏まえ、Web開発/制作者はコンテンツに対して、以下の指針を持つ必要があります。

〜IE8 「ブラウザ検出」を利用したコンテンツの開発/制作
IE9〜/Firefox/Chrome 「機能/動作検出」を利用したコンテンツの開発/制作

個人的な感覚ですが、IEのレンダリングエンジンは、5-6、7-8、9-10と、2バージョンが類似した動作を行う傾向にあるように思えます。機能面で見ればIE10からになりますが、Microsoft側の見解としてはIE9以降であり、IEのレンダリングエンジンの特性から見ても現実的な判断であると考えられます。

Microsoftは今後、IEを機能/動作検証の指針で利用されることを想定して開発を進めるでしょう。IE10/11で行った大胆な仕様変更を鑑みると、IEはどこかのタイミングで互換表示機能を廃止することも考えられます。Webブラウザを検出を許すような設計はインパクトが大きいため、上記に挙げた2つの指針は厳守すべきです。もしこれが守られなかった場合、企業システムであれば、IEのバージョンアップに多くのコストを要する可能性があります。

★ 4.2. 「デバイス検出」→「機能/動作検出」

iPhoneのブーム以降、世の中にスマートデバイスやタブレットという新しいデバイスが利用されるようになり、Webブラウザを取り囲む環境は大きく変化しました。Webブラウザの機能は汎用化されましたが、一方でOS側の持つデバイスや機能が多様化しました。このような背景の中、MicrosoftはWindows8以降のOSからは、デスクトップ型とスマートデバイス型の違いを意識させないOS作りへ方針を変えています。
(※参考 : Windows help & learning - Microsoft Support)

f:id:furoshiki0223:20131119003251p:plain

デバイスも、キーボードをつなげればデスクトップ型になり、外せばスマートデバイス型へ変化するというコンピュータを広げようとしています。このようなデバイスが広がれば、必然としてサーバサイドでデバイスの種類を区別するようなWebコンテンツのデザインは歓迎されないでしょう。
(※参考 : Surface 2 - Microsoft )

f:id:furoshiki0223:20131119003404p:plain

近年「レスポンシブWebデザイン」という手法が広がっていますが、Microsoftもこれを推進しており、必要なOSSのJSライブラリを一式、Microsoft側でサポートしています。Webサイト/システムは、サーバ側でデバイスに応じて返すビューを変えるのでなく、クライアント側でマルチデバイスに対応したビューを用意する必要があります。
(※参考 : オープンソースのJavaScriptライブラリでベンダサポートを受ける方法 - ふろしき.js)

レスポンシブWebデザイン導入のメリットが見いだせない制作/開発者の方もいるようですが、デバイスがデスクトップとスマートデバイスの違いが無くなろうとしている今の状況を鑑みれば、導入は必然なものとして考えることができるでしょう。エンタープライズ系の場合、企業にタブレットの導入が広がっているのであれば、レスポンシブWebデザインのようなマルチデバイス対策は進めていく必要があります。

ブログのGoogleの検索結果表示を操作する方法

Googleの検索結果を操作する方法について解説します。

どのサイトも断片的にしか説明していないため、本記事では変更作業からGoogle側へ反映するまでの一連の流れを手順書化して解説しています。

★ 手順の流れ

  • 1. 検索結果の表示を変更する
    • コンテンツのタイトル/概要を制御したい場合
    • 著者情報を表示したい場合
  • 2. 検索結果の表示状態を確認する
    • Webサイトが外部へ公開されている場合
    • Webサイトが外部へ公開されていない場合
  • 3. Googleのクローラーへ変更を通知する
    • Googleのウェブマスターツールへサイトを登録していない場合
    • Googleのウェブマスターツールへサイトを登録している場合

1. 検索結果の表示を変更する

★ コンテンツのタイトル/概要を制御したい場合

HTMLドキュメント内のhead要素内で、meta要素を埋め込むことで制御します。ブログの場合は、「設定画面」に含まれていることがあります。ここではHTMLドキュメントへ埋め込む場合を前提とします。

以下は、本サイトの例です。

f:id:furoshiki0223:20131118012329p:plain

<meta property="og:title" content="ふろしき.js - 実用的なWeb技術を発信"/>
<meta property="og:url" content="http://furoshiki.hatenadiary.jp/"/>
<meta property="og:description" content="「実用的な技術」に〜" />
  • ①. og:title → 検索結果の「タイトル」を制御します。
  • ②. og:url → 検索結果の「URL」を制御します。
  • ③. og:description → 検索結果の「概要」を制御します。

概要については、検索結果によって変動します。Webサイトを直接検索しない限り、概要は表示されないとみなせます。

★ 著者情報を表示したい場合

著者情報の表示は、Google Plusとの連携によって行えます。Google Plusにてアカウントを作成し、プロフィール情報を入力して下さい。

プロフィール作成が完了したら、今度は著者情報の表示を行うための設定をGoogle Plus側で行います。Google plus画面の右上の写真をクリックし、「プロフィールを表示」をクリックし、「基本情報」をクリックして下さい。

f:id:furoshiki0223:20131118013437p:plain
f:id:furoshiki0223:20131118013447p:plain

「リンク」欄の、「寄稿先」を登録します。
f:id:furoshiki0223:20131118014112p:plain
f:id:furoshiki0223:20131118013815p:plain
f:id:furoshiki0223:20131118013821p:plain

Webサイト側に、以下のリンクを埋め込んで下さい。a要素のGoogleは消さないで下さい。

<a href="https://plus.google.com/[profile_id]?rel=author" style="display:none;">Google</a>

これで完了です。正しく設定できているかを確認するには、次章の手順に進んで下さい。

2. 検索結果の表示状態を確認する

まず、「構造化データ テスト ツール」へアクセスします。
http://www.google.com/webmasters/tools/richsnippets?hl=ja

★ HTMLが外部へ公開されている場合

「URL」タブのURL欄へ入力し、「プレビュー」をクリックします。
f:id:furoshiki0223:20131118000307p:plain

★ HTMLが外部へ公開されていない場合

「HTML」タブでHTMLドキュメントをコピー&ペーストし、「プレビュー」をクリックします。
f:id:furoshiki0223:20131118000435p:plain

3. Googleのクローラーへ変更を通知する

★ Googleのウェブマスターツールへサイトを登録していない場合

以下のURLへアクセスし、URLを入力、「リクエストを送信」をクリックします。
https://www.google.com/webmasters/tools/submit-url?hl=ja
f:id:furoshiki0223:20131118010155p:plain

★ Googleのウェブマスターツールへサイトを登録している場合

Googleが提供している「ウェブマスター ツール」へアクセスします。ホーム内から、登録している自身のWebサイトを選択します。ここでは例として、本ブログページを選択します。
https://www.google.com/webmasters/tools/home?hl=ja
f:id:furoshiki0223:20131117234815p:plain

次に、「クロール」の「Fetch as Google」を選択します。今回はWebサイト全体の表示方法を変更するため、②のURL欄は空欄にし、③の取得をクリックしましょう。
f:id:furoshiki0223:20131117234824p:plain

「インデックスに送信」をクリックして、表示されたモーダルウィンドウ上の「OK」ボタンをクリックします。
f:id:furoshiki0223:20131117234833p:plain

この設定では、即時では反映されません。クローラーの訪問が早くなるため、Googleの検索結果ページへの反映が早くなります。

1300の優良サイトが選んだWeb制作のベストプラクティス集

Web制作/開発に関わっていると、自分のやり方は本当に正しいのかと疑問に感じることはないでしょうか?

Webの技術は目まぐるしい速度で進化していますが、そのノウハウは個人へ依存しているように思えます。体系的に学ぶにも、多くの学校ではツールや綺麗な作法の説明に力を注ぎ、現場特有の泥臭い部分をなかなか教えてはくれないでしょう。

そこで今回、実際にインターネット上で公開されている企業サイト・ネットショップ・デザイナーサイトのうち、優良と評価された1300のサイトをスクリプト解析し、サイトの制作/開発にどのような技術/テクニックが利用されているのか調査してみました。

実際に利用されている「JS/CSSライブラリ」にフォーカスし、統計ベースで一覧化しています。現場の方は仕事のお供に、またこれからWeb制作/開発の学習を行う方は、言葉と作法を理解するために活用して頂ければ幸いです。


  1. PNG Fix
  2. CSSリセット
  3. AMD/遅延ロード
  4. UserAgentスニッフィング/クロスブラウザ判定/マルチブラウザ判定
  5. CSSポリフィル/シムライブラリ
  6. マウスオーバー/ロールオーバー
  7. コンテンツスライダー
  8. pjax/hash fragment/pushState
  9. オーバーレイイメージ
  10. フルスクリーンバックグラウンドイメージ
  11. コンテンツスクロールバー
  12. ページスクローラー
  13. ページレイアウト/Webデザイン支援

Internet Explorer 11のユーザエージェント問題 - 対策方法の全て

f:id:furoshiki0223:20131113210652p:plain

Internet Explorer11へアップデートされてから1ヶ月。多くのWebアプリが動作不良を起こし、混乱が生じているようです。

IEは11から、「User Agent スニッフィング」と呼ばれる手段で、Webブラウザに依存した作り込みが行われることを防ぐため大胆な仕様変更を行いました。これまでWebブラウザ/バージョンの特定の手段として広く利用されていたユーザエージェント文字列から、重要な項目が削除されたのです。

ネット上では断片的な情報が散らばっているようですが、不十分な対策も多く見受けられます。そこで今回、対策の方法について体系的かつ網羅的に理解できるよう、4つの観点から整理してみました。

本稿が、読者の方が運用しているシステムへ万全の対策を行えることを、そして開発者がWebの正しい指針に従い開発を進める助けになれば幸いです。

IE11の設計指針「User Agent スニッフィング」の防止とは?

今回のIEの仕様変更は、少々強引とはいえ、Web技術にポジティブなインパクトを与えるきっかけになるでしょう。

IEは近年のWeb開発のお作法である「機能の有無によるクロスブラウザ型のWeb開発」という思想を広めるため、現在悪とされている「ユーザエージェント特定によるマルチブラウザ型のWeb開発」、つまりWebブラウザごとに個別の作りこみを行いにくい仕様へ徐々に移行を進めてきました。バージョンを上げるごとにユーザエージェントに含まれる.NETフレームワークのバージョンなどIE固有の情報を減らし続け、そしてバージョン10からは「条件付きコメント」の廃止という思い切った仕様変更を行っています。

サーバ側でIE/バージョンの特定を行うための実用的な情報は廃止しなかったため、サーバ側のミドルウェアへのインパクトはほぼ皆無でした。IEそのものがWeb標準への準拠が高くなったため、十分なマルチブラウザ対策が行われているサービスであれば、クライアント側でも問題は小さかったようです。

しかし今回、11へのアップデートでは、サーバ・クライアントの双方でWebブラウザの種類を判別するためにもっとも広く利用されている、ユーザエージェントの内容を大きく変更しました。この変更は、Webブラウザでの動作切り替えを行わないと現実的な開発が行えなかった3-5年以上前の古いWebアプリ・サイトで、動作不良を起こす原因となっています。また、JavaScriptのAPI経由でユーザエージェント情報を収集し動作を切り替えていたサービスでも、同様に問題となっているようです。

理想を言えば、このタイミングでIEに依存しない作り込みをサーバ側でも行うべきです。しかし実態としては、既存資産の維持へは最小のコストで対策し、次の更改まで維持し続けることが現場として求められることでしょう。本稿で紹介した4つの対策は、あくまで既存資産を延命させるための対策であるものと考えて下さい。新規開発であれば、これからご紹介する「クロスブラウザ対策」を参考に開発することが推奨されます。

正しい解決、クロスブラウザ対策

現在Webでは、Webブラウザの持つ機能の有無に応じて動作を変えるという手法が推奨されています。Microsoftが公開しているドキュメントからも、その思想が読み取れるはずです。

▼ 機能検出と動作検出の使用
http://msdn.microsoft.com/ja-jp/library/ie/ff986088(v=vs.85).aspx

MicrosoftのドキュメントではjQuery.supportを推奨していますが、より高度な機能を有したModernizrも有用です。その利用方法と思想については、本ブログでも記事としてまとめています。

▼ クロスブラウザ対応を助けるJSライブラリ"Modernizr"
http://furoshiki.hatenadiary.jp/entry/2013/06/29/220621

最後に、Microsoftが公開しているIE11の互換性/変更点に関するドキュメントを紹介します。

▼ ブラウザーの機能と互換性の変更点
http://msdn.microsoft.com/ja-jp/library/ie/dn467848(v=vs.85).aspx

IE11のユーザエクスペリエンスの改善の多くは、マルチデバイス時代への対応を意識したものが多いようです。今後のIEのアップデートでも、この傾向はより強くなるものと予想されます。

JSライブラリを利用した開発は高いユーザエクスペリエンスと相互運用性を確保できますが、デスクトップUIへ特化しているケースも多いように思えます。IEのバージョンだけでなくマルチデバイスへの対応もトータルに考えて、Web標準技術の利用ついて、考える必要があるでしょう。

このブログの筆者について

川田 寛

コンテンツサービスの開発や運営代行を専門とする集団「株式会社ブートストラップ」の社長です。ネットではふろしきと呼ばれています。

2009年にNTTグループへ新卒入社し、ITエンジニアとしてクラウド技術・Web技術の研究開発と技術コンサルティングに従事。2015年よりピクシブに入社し、エンジニアリングマネージャー・事業責任者・執行役員CCOなど、様々な立場からコンテンツサービスの事業づくりに関わりました。2021年にメディアドゥへVPoEとしてジョインし出版関係の事業に関わったのち、2023年に独立しています。

関わってきたインターネット事業としては、ECサービスのBOOTH、UGCプラットフォームのpixiv(主に海外展開)、制作ツールのpixiv Sketch、VR・VTuber関連ではVRoid、Wikiサービスのピクシブ百科事典など、10を超える多様なCtoCコンテンツサービス。また、NTTドコモのすご得コンテンツ、メディアドゥのWeb3サービスであるFanTopなど、いくつかのBtoCコンテンツサービスにも関わってきました。

幸運なことに、私はコンテンツに関係する幅広いインターネットサービスのテクノロジー&ビジネスの知識を得ることができました。これを日本のコンテンツ発展に役立てたいと思い、株式会社ブートストラップを創業しました。

このブログでは現在、出版社やIPホルダー、ライセンサーといったコンテンツに関わる人々に向けて、インターネット事業に関するTipsや業界内のトレンドなどの情報を発信しています。私と話をしてみたいという方は、以下のフォームより気軽にご連絡ください。

お問い合わせフォーム