web-dev-qa-db-ja.com

ライブラリなしのJavaScriptでIEが9未満かどうかを確認する最良の方法

JQueryまたはアドオンライブラリを使用せずに、JavaScriptでIEおよび9未満のバージョンであるブラウザーを検出するための、あなたの最速、最短(最良)の方法は何ですか?

77
bcm

Javascript

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;

}());

その後、次のことができます。

ie < 9

ジェームズ・パノリーによるこちらから: http://james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments

118
Mike Lewis

価値があるもの:

    if(  document.addEventListener  ){
        alert("you got IE9 or greater");
    }

addEventListenerメソッドはIEを除くすべての主要なブラウザで非常に早い段階でサポートされていたため、これはIE 9+を正常にターゲットにします。 (Chrome、Firefox、Opera、Safari) MDNリファレンス 。現在IE9でサポートされており、今後も引き続きサポートされる予定です。

99
vector

条件付きコメントを使用すると、IE未満の場合にのみ実行されるスクリプトブロックを作成できます。

<!--[if lt IE 9 ]>
<script>
var is_ie_lt9 = true;
</script>
<![endif]--> 

もちろん、var is_ie_lt9=falseを宣言するユニバーサルブロックをこのブロックの前に置くこともできます。これにより、9よりも小さいIEがオーバーライドされます(その場合は、var宣言を削除します、繰り返しになるため)。

EDIT:これは、インラインスクリプトブロックに依存しない(外部ファイルから実行できる)バージョンですが、ユーザーエージェントスニッフィングを使用します。

@ cowboy 経由:

with(document.createElement("b")){id=4;while(innerHTML="<!--[if gt IE "+ ++id+"]>1<![endif]-->",innerHTML>0);var ie=id>5?+id:0}
27
Yahel

条件付きコメントにバハ!ずっと条件付きコード!!! (愚かなIE)

<script type="text/javascript">
/*@cc_on
   var IE_LT_9 = (@_jscript_version < 9);
@*/
</script>

真剣に、それはあなたにそれがあなたによく合った場合にそれを投げるだけです...彼らは同じことです、これはインラインHTMLの代わりに.jsファイルにちょうどあります

注:jscript_versionチェックがここで「9」であることは完全に偶然です。 8、7などに設定しても「is IE8」はチェックされません。これらのブラウザのjscriptバージョンを検索する必要があります。

10
Mark Kahn

以下は、James Padolseyのソリューションに対する改善点です。

1)メモリを汚染しません(たとえば、JamesのスニペットはIE11の検出時に7つの削除されていないドキュメントフラグメントを作成します)。
2)マークアップを生成する前にdocumentMode値をチェックするため、高速です。
3)特にJavaScriptプログラマーの初心者にとっては、はるかに読みやすくなっています。

要旨リンク: https://Gist.github.com/julianshapiro/9098609

/*
 - Behavior: For IE8+, we detect the documentMode value provided by Microsoft.
 - Behavior: For <IE8, we inject conditional comments until we detect a match.
 - Results: In IE, the version is returned. In other browsers, false is returned.
 - Tip: To check for a range of IE versions, use if (!IE || IE < MAX_VERSION)...
*/

var IE = (function() { 
    if (document.documentMode) {
        return document.documentMode;
    } else {
        for (var i = 7; i > 0; i--) {
            var div = document.createElement("div");

            div.innerHTML = "<!--[if IE " + i + "]><span></span><![endif]-->";

            if (div.getElementsByTagName("span").length) {
                return i;
            }
        }
    }

    return undefined;
})();
9
execution
var ie = !-[1,]; // true if IE less than 9

このハックは、ie5,6,7,8でサポートされています。 ie9 +で修正されました(したがって、この質問の要求に適合します)。このハックは、すべてのIE互換モードで機能します。

仕組み:つまり、エンジンは空の要素を持つ配列(この[、1]など)を2つの要素を持つ配列として扱い、代わりに他のブラウザは要素が1つしかないと考えます。したがって、この配列を+演算子で数値に変換すると、次のようになります:( '、1' in ie/'1' in other)* 1そして、NaNをieに、他に1を取得します。それをブール値に変換し、!で値を逆にするよりも。シンプル。ちなみに、我々はなしで短いバージョンを使用することができます!署名しますが、値は逆になります。

これは今までで最短のハックです。そして、私は著者です;)

8
Aleko

代わりにオブジェクト検出を使用することにしました。

これを読んだ後: http://www.quirksmode.org/js/support.html そしてこれ: http://diveintohtml5.ep.io/detect.html#canvas =

私は次のようなものを使用します

if(!!document.createElement('canvas').getContext) alert('what is needed, supported');
6
bcm

このリンクには、Internet Explorerのバージョンの検出に関する関連情報が含まれています。

http://tanalin.com/en/articles/ie-version-js/

例:

if (document.all && !document.addEventListener) {
    alert('IE8 or older.');
}
5
Michael Benin

もし私があなただったら 条件付きコンパイル または機能検出を使うでしょう。
別の代替手段を次に示します。

<!--[if lt IE 9]><!-->
<script>
    var LTEIE8 = true;
</script>
<!--<![endif]-->
4
Knu

正規表現と.match()を使用して、すばやく汚いやり方でそれを行うことができます。

if (navigator.userAgent.match(/MSIE\s(?!9.0)/)) {
    // ie less than version 9
}
4
Alex

マイク・ルイスの答えは好きでしたが、コードはjslintを通過せず、ファンキーなwhileループを理解できませんでした。私のユースケースは、IE8以下の場合、サポートされていないブラウザーのメッセージを表示することです。

Mike Lewisに基づくjslintの無料バージョンは次のとおりです。

/*jslint browser: true */
/*global jQuery */
(function () {
    "use strict";
    var browserNotSupported = (function () {
        var div = document.createElement('DIV');
        // http://msdn.Microsoft.com/en-us/library/ms537512(v=vs.85).aspx
        div.innerHTML = '<!--[if lte IE 8]><I></I><![endif]-->';
        return div.getElementsByTagName('I').length > 0;
    }());
    if (browserNotSupported) {
        jQuery("html").addClass("browserNotSupported").data("browserNotSupported", browserNotSupported);
    }
}());
2
Doug

JavaScriptで行う必要がありますか?

そうでない場合は、IE固有の条件付きコメント構文を使用できます。

<!--[if lt IE 9]><h1>Using IE 8 or lower</h1><![endif]-->
2
LukeH
if (+(/MSIE\s(\d+)/.exec(navigator.userAgent)||0)[1] < 9) {
    // IE8 or less
}
  • IEバージョンの抽出:/MSIE\s(\d+)/.exec(navigator.userAgent)
  • iE以外のブラウザの場合、これはnullを返すため、その場合||0null0に切り替えます。
  • [1]は、IEまたはIEブラウザでない場合はundefinedのメジャーバージョンを取得します
  • 先頭の+は数値に変換され、undefinedNaNに変換されます
  • NaNを数値と比較すると、常にfalseが返されます
1
Ivan

あなたはすべて、そのような単純なことを過度に複雑にしようとしています。単純で単純なJScript条件付きコメントを使用するだけです。 IE以外のブラウザーにゼロコードを追加して検出するため、最速です。また、HTML条件付きコメントがサポートされる前のIEのバージョンに対応する互換性があります。要するに、

var IE_version=(-1/*@cc_on,@_jscript_version@*/);

ミニファイヤに注意してください:ほとんどの(すべてではないにしても)特別な条件付きコメントを通常のコメントと間違えて削除します

基本的に、上記のコードはIE_versionの値を、使用しているIEのバージョン、またはIEを使用していない-1 fに設定します。ライブデモンストレーション:

var IE_version=(-1/*@cc_on,@_jscript_version@*/);
if (IE_version!==-1){
    document.write("<h1>You are using Internet Explorer " + IE_version + "</h1>");
} else {
    document.write("<h1>You are not using a version of Internet Explorer less than 11</h1>");
}
0
user7892745