47

IE を検出するために、ほとんどの Javascript ライブラリはあらゆる種類のトリックを実行します。

  • jQuery は、ページの DOM に一時オブジェクトを追加して、いくつかの機能を検出するようです。
  • YUI2 は、そのYAHOO.env.ua = function()(file yahoo.js)内のユーザー エージェントで正規表現を実行します。

この回答を読んだ後、それは本当だと思いました.Javascriptで単にIEを検出するには、ページに追加するだけです:

<!--[if IE]><script type="text/javascript">window['isIE'] = true;</script><![endif]-->

<script type="text/javascript" src="all-your-other-scripts-here.js"></script>

これで、window.isIE次のようにするだけで、すべての Javascript コードに対して変数が設定されました。

if(window.isIE)
   ...

すべてのページに追加する必要があるため、これが苦痛になる可能性があるという事実に加えて、私が気付いていない可能性のある問題/考慮事項はありますか?


参考までに:ブラウザ検出よりもオブジェクト検出を使用した方がよいことはわかっていますが、それでもブラウザ検出を使用しなければならない場合があります。

4

15 に答える 15

58

James Padolsey がGitHubに小さなスニペットを置いたので、ここで引用します。

// ----------------------------------------------------------
// A short snippet for detecting versions of IE in JavaScript
// without resorting to user-agent sniffing
// ----------------------------------------------------------
// If you're not in IE (or IE version is less than 5) then:
// ie === undefined
// If you're in IE (>=5) then you can determine which version:
// ie === 7; // IE7
// Thus, to detect IE:
// if (ie) {}
// And to detect the version:
// ie === 6 // IE6
// ie > 7 // IE8, IE9 ...
// ie < 9 // Anything less than IE9
// ----------------------------------------------------------

// UPDATE: Now using Live NodeList idea from @jdalton

var ie = (function(){

    var undef,
        v = 3,
        div = document.createElement('div'),
        all = div.getElementsByTagName('i');

    while (
        div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
        all[0]
    );

    return v > 4 ? v : undef;

}());

もちろん、すべてのクレジットは James に送るべきです。私はただのメッセンジャーです (ただし、私のコピー アンド ペースト操作が間違っていた場合は、メッセンジャーを撃ってください)。

作成されたフォークも見てください。ポール・アイリッシュはコメントで内部の仕組みを説明しました。

于 2010-11-19T18:33:11.817 に答える
39

そのようにしたい場合は、htmlを変更することなくJavaScript内で実行できるため、代わりに条件付きコンパイルを使用する方がはるかに優れていると思います:

var isIE = /*@cc_on!@*/false;
于 2010-11-12T21:40:15.193 に答える
6

私はあなたが探しているものを持っていると思います。Javascript と clientCaps を使用して、Internet Explorer のフル バージョンを文字列 "AA.BB.CCCC.DDDD" として取得できます。

http://www.pinlady.net/PluginDetect/IE/

IE 5.5 以降 (IE 10 を含む) で動作するようです。navigator.userAgent/ドキュメント モード/ブラウザ モードの影響を受けません。条件付きコメントや余分な HTML 要素は必要ありません。これは純粋な Javascript ソリューションです。

現時点では、IE Mobile がどのように動作するかはわかりませんが、この clientCaps メソッドが失敗した場合に備えて、いつでもバックアップ検出メソッドを使用できます。

これまでのところ、かなりうまく機能していると言わざるを得ません。

于 2012-10-21T13:59:48.843 に答える
4

あなた自身の質問に答えたと思います: まず、IE のみを検出するため、スクリプトは本質的にブラウザーの世界を IE と <everythingelse> の 2 つの部分に分割します。

次に、すべての HTML ページに風変わりなコメントを追加する必要があります。jQuery や YUI などの幅広い JavaScript ライブラリは、さまざまなサイトに挿入/利用するのが「簡単」でなければならないことを考えると、すぐに使用するのは自動的に難しくなります。

于 2010-11-12T21:45:24.480 に答える
3

navigator.userAgentブラウザー検出 (機能検出ではなく) が本当に必要な場合に存在し、jQuery はそれを使用して$.browserオブジェクトの情報を取得します。すべてのページに IE 固有の条件付きコメントを含める必要があるよりもはるかに優れています。

于 2010-11-12T21:34:57.407 に答える
2
var version = navigator.userAgent.match(/(msie) (\d+)/i);
console.log(version);

誰かがそれを望んでいる場合に備えて、この質問を見てすぐに書きました。

** 編集 **

以下の Johnny Darvall のコメントに従って、 Internet Explorer 11を盗聴しようとしている人のためにリンクを追加します。

http://blogs.msdn.com/b/ieinternals/archive/2013/09/21/internet-explorer-11-user-agent-string-ua-string-sniffing-compatibility-with-gecko-webkit.aspx

于 2013-07-11T22:02:52.767 に答える
1

ブラウザをチェックするのは悪い考えです。代わりに、ブラウザの機能をチェックすることをお勧めします。たとえば、通常、IE でサポートされていない機能を使用するために、ユーザーが IE を使用しているかどうかを確認します。しかし、現在および将来のすべての非 IE ブラウザがその機能をサポートすることをご存知でしょうか? いいえ、たとえばjQueryで使用される方法の方が優れています。特定のバグ/機能をチェックする小さなテストケースを作成および実行します-ユーザーが特定のブラウザーを使用しているかどうかをチェックする代わりに、if(browser_supports_XYZ)などを簡単にチェックできます。

とにかく、スクリプトを使用してテストできない視覚的なバグであるため、ブラウザーのチェックが必要な場合が常にあります。この場合、条件付きコメントの代わりに javascript を使用することをお勧めします。これは、他の場所ではなく、必要な位置でブラウザーがチェックするようにするためです (そのファイルで定義されていない isIE をチェックする .js ファイルを想像してください)。 )

于 2010-11-12T21:41:13.983 に答える
0

私のユースケースでは、IE9 よりも低いかどうかを検出する必要があるだけなので、

if (document.body.style.backgroundSize === undefined && navigator.userAgent.indexOf('MSIE') > -1)
{
//IE8- stuff
}
于 2014-03-08T00:14:08.703 に答える
-1

これはかなりうまく機能し、
var isIe = !!window.ActiveXObject;

于 2011-09-24T23:40:45.307 に答える
-1
  • グローバル名前空間を汚染します
  • 2 つのファイルを変更する必要があります。
  • IEのみで動作します
  • 技術的には、条件付きコメントはコメントのままです
于 2010-11-12T21:48:03.210 に答える
-1

HTML5でプログラミングして、それを確認してみませんか

if ( window.navigator.product !== "Gecko" )

?? 確かに、これには「Gecko」の束に IE11 が含まれますが、これで十分ではないでしょうか?

注: HTML5 仕様。navigator.product は「Gecko」を返さなければならないと言っています...そしてIE10以前はすべて別のものを返します。

于 2015-01-03T16:14:58.467 に答える