クライアントのブラウザがIE7であるか、IE7互換モードのIE9であるかを区別できますか?私は自分のサイトでJSチェックを実行できるかどうかを調べようとしています。これにより、2つの異なることを認識し、結果に応じて異なることを実行できます。
- そのブラウザはIE7です
- そのブラウザはIE7互換モードです
私は最初の条件が正しく機能しています。それはどこでもそれを行う方法がほとんど言われているからです。2番目のものおよび/または両方の組み合わせについてはよくわかりません。
クライアントのブラウザがIE7であるか、IE7互換モードのIE9であるかを区別できますか?私は自分のサイトでJSチェックを実行できるかどうかを調べようとしています。これにより、2つの異なることを認識し、結果に応じて異なることを実行できます。
私は最初の条件が正しく機能しています。それはどこでもそれを行う方法がほとんど言われているからです。2番目のものおよび/または両方の組み合わせについてはよくわかりません。
少なくともIE8とIE9の場合navigator.userAgent
、サブストリングが含まTrident
れているかどうかを確認できます。IE8 +のユーザーエージェントには常にがありTrident
ますが、IE7にはありません。この回答とその中のMSDNリンクを参照してください。
IE10は扱いにくいようです。以下のコメントで報告されていますが、IE7エミュレーションモードでは常にTrident
存在するとは限りません。IE7が利用可能なプラットフォームでIE10が利用できない場合、おそらくOS文字列(例)はIE10を明らかにします。Windows NT 6.2
User-Agent
HTTPヘッダーが常に一致するとは限らないことにも注意してくださいnavigator.userAgent
。これは、少なくとも互換性モードがオンになっている(IE7User-Agent
ヘッダーを送信する)がIE=Edge
、応答のようなものを検出する( navigator.userAgent
IE9に戻る)IE9の場合です。
ユーザーのブラウザが互換モードになっているかどうかを検出する方法はないと思います。ユーザーエージェント文字列はブラウザモードによって決定され、ドキュメントモードはx-ua-compatible
メタタグ(またはヘッダー)の存在、または場合によっては使用されるDoctypeによって決定されます。
互換モードは、古くて時代遅れの機能やハッキングに依存するページから現代のブラウザユーザーを保護することを目的としていました。それは実際にはあなたがテストしたいものではありません。代わりに、互換モードまたは非互換モードのいずれかでブラウザが理解できる標準準拠のコードを記述してください。
さまざまなブラウザモードとドキュメントモードのさまざまな結果を次に示します。
ブラウザモード:IE10互換ビュー/ドキュメントモード:IE7標準
navigator.userAgent
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/6.0;
.NET4.0E; .NET4.0C; Media Center PC 6.0; .NET CLR 3.5.30729;
.NET CLR 2.0.50727; .NET CLR 3.0.30729; BRI/2)"
document.documentMode
7
ブラウザモード:IE7 /ドキュメントモード:IE7標準
navigator.userAgent
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; .NET4.0E;
.NET4.0C; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 2.0.50727;
.NET CLR 3.0.30729; BRI/2)"
document.documentMode
7
ご覧のとおり、これら2つの方法では、ユーザーが互換性のあるビューであるかどうかを判断する方法はありません。
x-ua-compatible
サイトが互換表示リストに表示されている場合は、独自のヘッダーを提供することで、推奨されるレンダリングオプションを上書きできます。
<meta http-equiv="x-ua-compatible" content="IE=9" />
これにより、ブラウザは強制的にIE9標準モードになります(Doctypeの評価はありません)。IE=edge
可能な限り最新のモード(Internet Explorer10ではIE10標準)にするために使用できますが、これはお勧めしません。代わりに、テストした最新のモードに設定してください。
x-ua-compatible
ヘッダーがIE10に設定されているが、ユーザーが以前のブラウザーでページにアクセスした場合、最も近いレンダリングエンジンが使用されます。たとえば、ユーザーがIE9を使用してページにアクセスし、メタタグがブラウザーにIE10を使用するように指示した場合、ブラウザーはIE9標準モードにフォールバックします。
IE=9
これにより、ブラウザがIE9標準モードになることに注意してください。必ずしもブラウザがIE9のように動作するわけではありません。ブラウザをIE9のように動作させたい場合は、次のEmulateIE9
コンテンツを使用します。
<meta http-equiv="x-ua-compatible" content="IE=EmulateIE9" />
これにより、ブラウザはDOCTYPEが存在する場合はフォールバックして、ドキュメントモードが標準かQuirksかを判断します。
詳細については、ドキュメントの互換性の定義を参照してください。
グーグルでこのスレッドに到達する人のために、ここに別のオプションがあります:
http://www.quirksmode.org/js/detect.htmlにあるスクリプトを使用しています...。
if (BrowserDetect.browser == 'Explorer')
{
if (document.documentMode == 7 && BrowserDetect.version > 7)
{
// user is running IE in compatability mode
}
}
これは私のために働きます:
/**
* Actual IE8-Browser running in IE8-Compat-Mode or IE7 Mode?
*/
MyUtils.isIE8CompatMode= function(){
if($.browser.msie && navigator.userAgent.indexOf('MSIE 7.0')>=0){
return true;
}
return false;
}
実際のIE8ブラウザーには、3つのドキュメントモード(IE7、IE8、および癖)と3つのブラウザーモード(IE7、IE8、およびIE8-互換性)があります。次の方法で、Document-ModeをIE8に強制できます。
<meta http-equiv="X-UA-Compatible" content="IE=8,chrome=1"/>
ただし、ブラウザの構成によって決定されるブラウザモードを強制することはできません。例:一部のお客様は、[互換モード]-[互換モード]-[互換性-表示]-[設定]-[ダイアログ]のチェックボックスをオンにしています。その場合、私たちはそれについて何もすることができません。
このサイトの非常に啓発的な図を参照してください。
上記の関数は何に使用しますか?互換モードではページにいくつかの不具合が表示されるため、ユーザーに、なぜ見栄えが悪いのか、そしてユーザーがそれに対して何ができるのかを伝える必要があります。そのため、上記の関数を使用して問題が発生しているかどうかを確認し、ユーザーに小さな警告を表示します。
ie9およびie10の互換性モードでは、アプリは正常に表示されるため、必要ありません。この応答は、この質問に対する回答と見なすことができます。これの複製としてマークされたie8互換モードを検出します。おそらくそれは誰かを助けます。
これは、サンノゼに拠点を置く大規模なオークションサイトに対して行ったかなり防弾のチェックです。
var userAgentString = navigator.userAgent;
if(/MSIE 7\.0/gi.test(userAgentString) && /Trident/gi.test(userAgentString)){
// compatibility mode
// .... code goes here ....
}