ユーザーエージェント文字列を介してIE7またはIE8であると自分自身を識別しているブラウザーが本当にそれらのブラウザーであるかどうか、またはそれが7または8互換モードのIE9であるかどうかを知る必要があります。
ユーザーエージェント文字列で見ることができるものから、IE7互換モードのIE9は、実際のIE7と同じ文字列を提供します。それが「本当に」IE9に変装しているかどうかを確認するためにテストできる追加のプロパティ/要素/オブジェクトはありますか?
スクリプトが読み込まれるページは強制的な動作または特定の設定を強制する可能性があるため、ドキュメントモードは役に立ちません。
IE9には、7、8、または9モードのいずれであるかに関係なく、存在し、テスト可能なプロパティがあることを期待しています。
追加するために編集…
OK、私は今どこが間違っていたのかわかります。 「ブラウザモード」ドロップダウンを使用してIE8とIE7に切り替え、これをそれぞれ「IE8互換モード」と「IE7互換モード」と考えていました。もちろんこれは真実ではありません。開発者ツールのブラウザモードは、実際には古いブラウザに「似ている」ように切り替えているため、元のユーザーエージェント文字列が報告されるのは正しいことです。
IE9またはIE9の互換性でブラウザーモードを終了し、代わりにドキュメントモードドロップダウンバリアントを試してみると、実際には8つのすべての組み合わせ(2つのブラウザーモードと4つのドキュメントモード)で「Trident/5.0」が表示されます。ブラウザーモードIE7およびIE8は本当に(シミュレートされた)IE7およびIE8であるため、選択する必要はありません。
そのため、ページ、開発者以外のユーザー、メタタグ、またはMicrosoftの互換性リストがIE9をこの識別不可能な状態にする方法はありません。
if(navigator.userAgent.indexOf("Trident/5")>-1)
を使用するだけで十分です。
心配しないでください、これはスタイル、フォーマット、ロジック、またはページコンテンツ用ではありません。私はそれらのことに対して機能検出を使用します。 IE9を検出して(それがどのモードであるかに関係なく)、それについてページ以外のコンテンツを決定する必要があります。
あなたの提案とリンクで答えに向かってくれてありがとう。
実際、IE7互換モードで実行される場合、IE9のユーザーエージェント文字列は異なるため、これは異なるIEバージョンを区別する最良の方法の1つです。
IE8と同様に、IE9の互換表示はIE7標準モードにマッピングされ、互換表示ではIE9のUA文字列は次のようになります。
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)
互換表示では、IE9はアプリケーションのバージョン番号(Mozilla/4.0)とバージョントークン(MSIE 7.0)を通じてIE7として自身を報告します。これは互換性のために行われます。 「Trident/4.0」から「Trident/5.0」に増加したTridentトークンにより、Webサイトは、Compat Viewで実行されているIE9とCompat Viewで実行されているIE8を区別できます。
(強調は私によって追加されました)。したがって、ユーザーエージェント文字列は、「Mozilla/4.0」およびMSIE 7.0であると報告するものと同じですが、IE9は、MSIE 7.0、MSIE 8.0、またはMSIE 9.0と言っても、常にTrident/5.0です。
実際には、この素晴らしいコンパイルをチェックアウトする必要があります: Browser ID(User-Agent)Strings またはそれ以上 useragentstrings.com
document.documentMode
は、ドキュメントモードに最適な方法です。
IE7にはTridentに関する情報は含まれていません
User-Agent : Mozilla/4.0 (compatible; MSIE 7.0)
IE8には次の文字列が含まれています: "Trident/4.0"
User-Agent : Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0)
IE9には次の文字列が含まれます: "Trident/5.0"
互換モードのIE9:
User-Agent : Mozilla/4.0 (compatible; MSIE 7.0; Trident/5.0)
通常モードのIE9:
User-Agent : Mozilla/5.0 (compatible; MSIE 9.0; Trident/5.0)
IE9には、7、8、または9モードのいずれであるかにかかわらず、存在し、テスト可能なプロパティがあることを期待しています。
確認してくださいstyle.opacityの場合、IE9で導入され、互換モードに関係なく使用可能です。
<![if IE]>
<script>
if(typeof document.documentElement.style.opacity!='undefined')
{
//this must be at least IE9
}
</script>
<![endif]>
Javascriptナビゲーターオブジェクトではなく、サーバー変数からユーザーエージェント文字列を読み取ることが必要な場合があります。
違いを比較します。
ASPクラシック、IE11
クライアントjavascript、navigator.userAgent: "Mozilla/5.0(互換性; MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS) "
サーバーASP、Request.ServerVariables( "HTTP_USER_AGENT"): "Mozilla/5.0(Windows NT 6.1; WOW64; Trident/7.0; BOIE9; ENUS; rv:11.0)like Gecko"
ASPクラシック、IE11互換モード:
クライアントjavascript、navigator.userAgent: "Mozilla/5.0(互換性; MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS))
サーバーASP、Request.ServerVariables( "HTTP_USER_AGENT"): "Mozilla/4.0(互換性; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5。 30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS) "
から https://stackoverflow.com/a/29288153/2879498
ID compat-warningの非表示要素があると仮定します。
Javascript w/jQuery:
$(function(){
function showCompatWarning() {
$('#compat-warning')
.css('display','block')
.css('height','auto')
.show();
}
var tridentOffset = navigator.appVersion.indexOf('Trident/');
if ( tridentOffset === -1 ) return;
var jscriptVersion = 0;
/*@cc_on @*/
/*@if (@_jscript) jscriptVersion = @_jscript_version ; @*/;
/*@end @*/
var tridentVersion = parseInt(navigator.appVersion.substr(tridentOffset+8),10);
var guessIEVersion = tridentVersion + 4;
if (( document.documentMode && jscriptVersion && jscriptVersion < 10 && jscriptVersion !== document.documentMode ) ||
( document.compatMode && document.compatMode === 'BackCompat') ||
( document.documentMode && document.documentMode < 10 && document.documentMode != guessIEVersion ))
showCompatWarning();
});
検出と警告、互換性の地獄に対する最初と最後の防衛線。