web-dev-qa-db-ja.com

「X-UA-Compatible」を使用してIE9ではなくIE8でIE7をエミュレートします

ベクター描画に依存するウェブサイトがあります。InternetExplorerでは [〜#〜] vml [〜#〜] を使用し、他のブラウザーでは [〜#〜 ] svg [〜#〜] 。ただし、IE8は、VMLを備えたIE7モードにフォールバックしない限り、どちらもサポートしていません。

したがって、<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />

問題(実際には良いことです)は、IE9がSVGをサポートするようになったため、IE7モードにフォールバックしてパフォーマンスと互換性が大幅に低下することを望まないことです。 IE8のみにIE7モードにフォールバックさせ、IE9をIE9モードのままにするにはどうすればよいですか?

現在、ヘッドにEmulateIE7-stringを含めるかどうか、エージェントでサーバー側のチェックを行っていますが、可能な限りこれを避けたいと思います。

42
Urjan

私はちょうど遊びを持っていて、私のために次の作品を見つけました:

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

それはセミコロンではなくカンマです!

私は仕様を見ていませんが、形式はChromeフレームで動作するcontent = "IE = 7、chrome = 1"に似ています。content= "IE = 7,9 "は動作しますが、正しい形式ではないと思われます。

編集:

ページがiframeにある場合、深刻な問題に注意してください。親がIE9厳格未満のanyモードにあるフレーム付きページで上記を使用すると、IE9はIE8モードにフォールバックします(IE = 7リクエストを無視!)。既知の回避策は歓迎します:) IE11には関係ないかもしれません。

上記は設計上の機能の副作用のようです。つまり、iframe(およびフレームを想定しています)はすべてIE9モードであるか、すべてがIE9モード未満です。 IE9フレームと<IE9フレームを混在させることはできません。MSの問題 #599022 および #635648 を参照してください。

編集2:

IE11は "IE = Edge"(IE = 11ではなく)のみをサポートし、IE = Edgeの使用はIE機能(ユーザーエージェントを含む)に大きな影響を与えることに注意してください。

編集3:

編集4:

X-UA-CompatibleはMicrosoft Edgeブラウザから削除されました。 Internet Explorerのみに互換モードがあります。 Windows Phone 10のアプリ内でWebViewを使用している場合は、まだEdgeではなくIE11を使用していることに注意してください。

また、さまざまな理由により、ユーザーエージェントに正しい互換性レベルを伝えることを信頼できないため、代わりにdocument.documentMode JavaScriptから。

編集5:

IE11には引き続きX-UA-Compatible に設定 IE=Edgeいくつかのコーナーケースの場合、例えば(ラッパーアプリケーション内のWebViewとして)ActiveXからIE11を使用しているお客様は、これを設定しない場合、IE11をIE7モードに戻すことができます。

41
robocat

他の誰かが言及したデュアルモードは、動作するはずです動作します(ただし、Microsoftが示すように動作しません)。メタ属性値がとるべき適切な形式を示す以下の更新があります。

したがって、これを使用する場合:

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

残念ながら、x-ua互換エンジンが行うファジーバージョンのベクトル化により、IE8としてIE8がレンダリングされます。このドキュメントを参照してください: ドキュメントの互換性の定義:コンテンツ属性値の理解 MSDNそのセクションでは、前半では、現在のブラウザバージョンよりも大きいと定義されたバージョンベクトルが、利用可能な最大のレンダリングエンジンとして解釈されることがわかります。したがって、emulateIE9はemulateIE8に変換されます。愚か。

次に、実際には同じ息で、特定のエンジンを除外するために、上記のコードスニペットのように複数のバージョンベクトルを使用することについて話します。しかし、ファジーバージョンロジックのため、それは機能しません。ああ、マイクロソフト。もう一度失敗します。

メタの周りでCCを使用できないのは、ブラウザがCCにヒットするまでにレンダリングエンジンを選択している必要があるためです。 x-uaメタは、MS自身のドキュメントによると、他のメタまたはタイトルを除くヘッダー内の何かより前に来る必要があります。

誰かがこれを理解できるなら、私はIE9を含めながらIE8をサポートから除外することを切望しているため、すべて耳にします。

重要な更新

Robocat は、Micrsoftが示すようにセミコロンの代わりにコンマを使用することが正しい方法であることを指摘しています。私はそれをテストし、それは私のために働いた。 テストページ を更新しました。

したがって、correctの形式は次のとおりです(robocatが示唆するとおり)。

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

incorrectの形式は次のとおりです(Microsoftの提案どおり)。

<meta http-equiv="X-UA-Compatible" content="IE=7; IE=9">
27
squareman

IE 8がIE7標準を使用し、IE 9がIE9標準を使用する場合、これは私のために働きました:

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

IE9の場合、これはIE 9互換モードとIE 9標準。IE8の場合、ブラウザモードIE8ドキュメントモードIE7標準を提供します。

3
J F

私はこれまでこれらすべてを使用しましたが、IE9では何も動作しません:

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

<httpProtocol>
        <customHeaders>
          <clear />
          <add name="X-UA-Compatible" value="IE=EmulateIE8" />
        </customHeaders>
    </httpProtocol>

これは非常にイライラするため、これらのメタタグはいずれも機能していないようです。マイクロソフト、ドキュメントで機能すべきだと言っているものをサポートするのに難しいことは何ですか?ブラウザ戦争をするのに何時間も費やさなければなりません。あなたはみんなの時間を無駄にしている。

3
Deepfreezed

これはIE9で機能します。

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