JavaScript:IE7またはIE8互換モードのIE9を検出できますか?


87

ユーザーエージェント文字列を介して自分自身をIE7またはIE8として識別しているブラウザーが実際にそれらのブラウザーであるかどうか、またはそれが7または8互換モードのIE9であるかどうかを知る必要があります。

ユーザーエージェント文字列で確認できることから、IE7互換モードのIE9は、実際のIE7と同じ文字列を提供します。それが "本当に" IE9を偽装しているかどうかを確認するためにテストできる追加のプロパティ/要素/オブジェクトはありますか?

私のスクリプトが読み込まれるページは、奇妙なことを強制したり、特定の設定を強制したりする可能性があるため、ドキュメントモードは役に立たないと思います。

IE9が7、8、9のいずれのモードであるかに関係なく存在し、テスト可能ないくつかのプロパティを持つことを期待しています。


追加するように編集…

OK、私は今どこが間違っているのかわかります。「ブラウザーモード」ドロップダウンを使用して、IE8とIE7に切り替えて、それぞれ「IE8互換モード」と「IE7互換モード」だと思っていました。これはもちろん本当ではありません。開発者ツールのブラウザーモードは、実際には古いブラウザーに「似ている」ように切り替えているため、元のユーザーエージェント文字列が報告されるのは誤りです。

IE9またはIE9互換性のブラウザーモードをそのままにして、代わりにドキュメントモードのドロップダウンバリアントを試してみると、8つの組み合わせ(2つのブラウザーモードと4つのドキュメントモード)で「トライデント/5.0」が表示されます。ブラウザモードIE7とIE8は本当に(シミュレートされた)IE7とIE8なので、ブラウザモードの選択を避ける必要があります。

したがって、ページ、開発者以外のユーザー、メタタグ、またはMicrosoftの互換性リストがIE9をこの識別不可能な状態にすることはできません。

使用if(navigator.userAgent.indexOf("Trident/5")>-1)するだけで十分です。

心配しないでください、これはスタイル、フォーマット、ロジック、またはページコンテンツ用ではありません。私はそれらの機能検出を使用します。IE9を検出し(現在のモードに関係なく)、ページに関するコンテンツ以外の決定を行うだけです。

あなたの提案とリンクで答えに向かって私を導いてくれてありがとう。


1
ユーザーエージェントを信頼しないでください...完全に嘘をつく可能性があり、それが真実かどうかを確認する方法はありません...代わりに特定の機能または機能をテストする必要があります
JCOC611

2
@ JCOC611はい、いいえ。これは、互換性ビューでIE9であるかどうかを確認する特定の質問です。これは合理的な質問です。一般に、サイトの機能をユーザーエージェント文字列に依存するべきではありません。
Dennis G

1
ユーザーエージェントが正確であっても、可能であれば機能検出を使用することをお勧めします。その場合、最初にIEが互換モードであるかどうかを知る必要はありません。
デイブワード

1
これは、間違ったブラウザモードを使用しているユーザーに簡単なチュートリアルを提供する場合に非常に便利であることを付け加えておきます。
Joost

1
@ JCOC611は、ユーザーエージェントを偽装し、正常に機能することを期待します。このケースについて本当に気にする必要がありますか?
JohnnyFaldo 14

回答:


67

実際、ユーザーエージェント文字列は、IE7互換モードで実行されているIE9とは異なるため、これは異なるIEバージョンを区別する最良の方法の1つです。

IE9のユーザーエージェント文字列の紹介

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になります。

実際には、この素晴らしいコンパイルをチェックする必要があります。ブラウザID(ユーザーエージェント)文字列、またはさらに優れたuseragentstrings.com


1
こんにちは。また、IE9がIE7モードのときに "Trident / 5.0"が存在すると想定されていましたが、Win7 Pro x64上の私の(最終的な)IE9には表示されていません。IE7モードではトライデントがまったく表示されず(これは実際のIE7の外観です)、IE8モードではトライデント4が表示されます(これも実際のIE8の外観です)。IE9開発者ツールを使用して、最初にドロップダウンしてブラウザーモードを選択し、次にアドレスバーでjavascript:alert(navigator.userAgent)に警告しています
Dee2000

1
「Trident / 5.0」は、すべてのモードでIE9のユーザーエージェント文字列に含まれています。
EricLaw

EricLawが言うように、ディー。互換モードを使用している場合は、Trident / 5.0が存在している必要があります(ブラウザーモードでは異なる場合がありますか?)。ユーザーエージェント文字列をどのように確認しますか?whatsmyuseragent.comで確認して、報告してください。
Dennis G

以下の私の応答を参照してください(独自のメッセージへの応答の追加に関するスタックオーバーフローの8時間ルールのため、別のID Dee2001を使用する必要がありました)。はい、EricとMoontearはどちらも正しいです。Trident/ 5.0 IE9のすべてのモードに存在します。私の大きな間違いは、開発者ツールで「ブラウザーモード」をIE7またはIE8に変更することでしたが、それはページ/メタタグ/互換性リストが適用できる「モード」ではありません。代わりに、ブラウザ自体を実際にシミュレートしているので、当然、useragent文字列は本当にIE7 / 8に似ています。
Dee2000、2011

1
これは完璧です!本当にありがとう。私は報告されたブラウザーに基づいてスタイルを設定していませんが、作業しているサイトの上部に警告バーを設定しています。これは、ユーザーがアップグレードする必要があることを示します(つまり、コンディショナルタグがie7以下である場合) -この場合はメッセージにアップグレードを表示せず、互換モードを無効にします
Chelsea Urquhart

47

document.documentMode ドキュメントモードに最適な方法です。


17
答えを少し広げてください。より多くのコンテキスト。
random_user_name

3
なぜ人々はこれをプラスしていないのか、まさにそれが必要なものです
Jamie Hutber '20 / 02/20

5
それは確かに最良の方法です。次のように使用できます<script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>。Real(!)IE7とすべての非IEは「未定義」を返します。CompではIE8 / 9のみが返されます。モードは7を返します。IE10はテストできませんが、同じである必要があります。
Frank Conijn 2013年

2
エッジMETAタグのある側でIE10でこれを試してみました。通常は「10」を返します。すべてのサイトで互換モードを強制的にオンにしても、「10」が返されます。
Whelkaholism

IE10およびIE11プレビューで私のために働く
サイモン

20

IE7にはトライデントに関する情報が含まれていません

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)

1
IE10ではトライデントも増加しますか?
slotishtype

3
Internet Explorer 10ユーザーTrident / 6.0 .... blogs.msdn.com/b/ie/archive/2012/07/12/を
slotishtype

1
IE11はTrident / 7.0を使用
Dee2000


11

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]>

1
Dr.Molleに感謝します。それを試して報告します。
Dee2000

残念ながら、これはブラウザーモード(IE9開発者ツールの左側のドロップダウン)でのみ機能します。ドキュメントモード(右側のドロップダウン)では機能しません。ドキュメントモードの場合、IE9ドキュメントモードでのみ機能します。IE8、IE7、またはQuirksモードの場合、そのロジックは失敗します。
Dee2000

7
くそー、あなたの権利。私は別のプロパティを見つけました、すべてのモードで機能します:window.performance
Dr.Molle

@ Dee2000:DocumentModeでも動作します。つまり、DocumentMode = "Internet Explorer 9 standard"の場合のみ、このテストは成功します。
NiklasBäckman、2012年

@ Dr.Molleのおかげで、window.performanceはうまく機能します。
lewsid

3

JavaScriptナビゲーターオブジェクトからではなく、サーバー変数からユーザーエージェント文字列を読み取る必要がある場合があります。

違いを比較します。

  • ASPクラシック、IE11

    • client 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) "

    • server 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互換モード

    • client 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)) "

    • server ASP、Request.ServerVariables( "HTTP_USER_AGENT"): " Mozilla / 4.0(compatible; 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) "


0

https://stackoverflow.com/a/29288153/2879498から

ID compat-warningの非表示要素があると仮定します。

JavaScriptと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();
});

検出と警告、互換性の地獄に対する防御の最初と最後の行。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.