IE11を検出する方法


212

IEを検出する場合は、次のコードを使用します。

function getInternetExplorerVersion()
{
  var rv = -1;
  if (navigator.appName == 'Microsoft Internet Explorer')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}
function checkVersion()
{
  var msg = "You're not using Internet Explorer.";
  var ver = getInternetExplorerVersion();

  if ( ver > -1 )
  {
    msg = "You are using IE " + ver;
  }
  alert( msg );
}

しかし、IE11は「Internet Explorerを使用していません」を返します。どうすればそれを検出できますか?



1
ユーザーエージェントに基づくものはすべて欠陥があります。なりすましは簡単ですが、これは問題ではないかもしれませんが、ブラウザの検出スクリプトがマスカレードを検出する可能性はかなり高いようです。条件付きコメントの組み合わせを使用し、フォールスルーしてdocument.documentModeを強制しようと試み、次に以下のPaul Sweatteのようにwindow.MSInputMethodContextを調べます。私は自分のコードを投稿しますが、それは死んだ馬をむち打ちます。
David G

3
IE11にはユーザーエージェント:Mozilla / 5.0(Windows NT 6.1; WOW64; Trident / 7.0; rv:11.0)のようなGecko Osタイプ:6.1-win7、6.3
かみそり

1
ここに私の答えを参照stackoverflow.com/questions/21825157/...
Royi Namir

1
これが私が見つけた最高のソリューションです:stackoverflow.com/a/20201867/2047385 if(Object.hasOwnProperty.call(window、 "ActiveXObject")&&!window.ActiveXObject){// is IE11}
xorcus

回答:


221

IE11はとして報告しなくなりMSIEました。この変更のリストによると誤検出を回避するためのものです。

IE を本当に知りたい場合にできることは、(テストされていない)のようなものを返すTrident/場合、ユーザーエージェント内の文字列を検出することです。navigator.appNameNetscape

function getInternetExplorerVersion()
{
  var rv = -1;
  if (navigator.appName == 'Microsoft Internet Explorer')
  {
    var ua = navigator.userAgent;
    var re = new RegExp("MSIE ([0-9]{1,}[\\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  else if (navigator.appName == 'Netscape')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("Trident/.*rv:([0-9]{1,}[\\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}

console.log('IE version:', getInternetExplorerVersion());

IE11(afaik)はまだプレビュー段階にあり、ユーザーエージェントはリリース前に変更される可能性があることに注意してください。


81
it's intentional to avoid mis-detection-悲しいことに、IE11がリリースされたため、IE11 のみで機能しないコードがありますが、IEの正しい検出は機能します...
Izkata

68
バージョンの重要性が低い場合は、このソリューションをブール値に変換しましたfunction isIE() { return ((navigator.appName == 'Microsoft Internet Explorer') || ((navigator.appName == 'Netscape') && (new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})").exec(navigator.userAgent) != null))); }
rg89

6
@lzkata- ここhtml5仕様によると、IEは実際には標準に従っています。そうです、それは意図的なものだが、それは新しい規格ごとです(古いHTMLのAPIを非推奨。)
マーク・Avenius

11
「彼らがこれを行った理由は意図的なものでした。このようなブラウザー検出スクリプトを壊したかったのです。」からstackoverflow.com/a/18872067/1066234 ...実際には次のようになります。
カイノアック、

15
これは私にとってvar isIE11 = !!navigator.userAgent.match(/Trident\/7\./);
Kai

86

!(window.ActiveXObject) && "ActiveXObject" in windowIE11を明示的に検出するために使用します。

IE(pre-Edge、 "Trident")のバージョンを検出するには、"ActiveXObject" in window代わりにを使用します。


2
このMicrosoftの記事は、このソリューションが機能しない可能性があることを示唆していますmsdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx
Alan

5
実際、この記事では、私の方法が機能する理由について説明します。window.ActiveXObject記事で説明されているように、にアクセスしようとするとundefined、IE11(およびMicrosoft以外のブラウザー)に戻ります。javascript in演算子を使用したテストはtrue、すべてのMicrosoftブラウザーに戻ります。そのため、IE11ではどちらも厳密に当てはまります。Microsoftがinオペレーターの動作に変更を加えた場合、はい、このメソッドは機能しなくなります。
mcw 14

5
ウィンドウの「ActiveXObject」はEdgeでFalseを返します。
Neo

8
@Neo EdgeはIEではない、OPの質問はIE11を検出する方法でした
mastazi

1
@mastaziそうですが、この回答では、ActiveXObjectを使用して任意のIEバージョンを検出できることが言及されています。EdgeがIEのバージョンと呼ばれるべきか否かは議論の余地がありますが(Microsoftは確かにそれを呼ばない方がよいでしょう)、多くの開発者にとってIEはデフォルトのMicrosoftブラウザの同義語になっています。
ネオ

45

MSInputMethodContext機能検出チェックの一部として使用します。例えば:

//Appends true for IE11, false otherwise
window.location.hash = !!window.MSInputMethodContext && !!document.documentMode;

参考文献


2
これはより堅牢なようです。確かに、ユーザーエージェントに基づくものはまったく役に立ちません。
David G

1
ActiveXObjectの代わりに機能します。
どうも

1
@tdakhla IE Edgeを除外するために更新されました。
Paul Sweatte、2015

これらの回答が機能していないように見える可能性があることに注意することは、エミュレーション設定を確認することです。この回答を不正とマークするつもりでしたが、エミュレーションを確認したところ、一部のイントラネット互換性設定が表示モードを上書きしていることがわかりました。 、それが方程式から除かれると、このソリューションは私にとってうまくいきました。
Shaun

1
#falseIE以外、IE8、9、10、Edge 14、15で確認されました。#trueIE11のみ。ドキュメントモードをアクティブにしてテストしませんでした。Browserstackでテスト済み。
ダンジャ2017年

15

私はあなたの答えを読んでミックスを作りました。Windows XP(IE7 / IE8)およびWindows 7(IE9 / IE10 / IE11)で動作するようです。

function ie_ver(){  
    var iev=0;
    var ieold = (/MSIE (\d+\.\d+);/.test(navigator.userAgent));
    var trident = !!navigator.userAgent.match(/Trident\/7.0/);
    var rv=navigator.userAgent.indexOf("rv:11.0");

    if (ieold) iev=new Number(RegExp.$1);
    if (navigator.appVersion.indexOf("MSIE 10") != -1) iev=10;
    if (trident&&rv!=-1) iev=11;

    return iev;         
}

もちろん、0を返した場合、IEはありません。


12

ユーザーエージェントからIEバージョンを取得する

var ie = 0;
try { ie = navigator.userAgent.match( /(MSIE |Trident.*rv[ :])([0-9]+)/ )[ 2 ]; }
catch(e){}

仕組み:すべてのIEバージョンのユーザーエージェント文字列は、「MSIE space version」または「Trident other-text rv space-or-colon version」の部分が含まれています。これを知って、String.match()正規表現からバージョン番号を取得します。あtry-catchブロックは、そうでない場合は、我々はIE以外のブラウザでは、配列の境界をテストする必要があるだろう、コードを短くするために使用されます。

注:ユーザーエージェントがブラウザを「互換モード」に設定している場合、ユーザーエージェントが偽装されたり省略されたりすることがあります。これは実際には問題のようには思えませんが。


ユーザーエージェントなしでIEバージョンを取得する

var d = document, w = window;
var ie = ( !!w.MSInputMethodContext ? 11 : !d.all ? 99 : w.atob ? 10 : 
d.addEventListener ? 9 : d.querySelector ? 8 : w.XMLHttpRequest ? 7 : 
d.compatMode ? 6 : w.attachEvent ? 5 : 1 );

仕組み: IEの各バージョンには、以前のバージョンにない追加機能のサポートが追加されています。そのため、トップダウン方式で機能をテストできます。三元もののシーケンスは、簡潔にするため、ここで使用されているif-thenswitchの記述はあくまで同様に動作します。変数ieは、5〜11の整数に設定されます。古い場合は1、新しい/ IE以外の場合は99に設定されます。IE 1-11を正確にテストしたい場合は、0に設定できます。

注:などのポリフィルを追加するサードパーティのスクリプトを含むページでコードを実行すると、オブジェクト検出が失敗する可能性がありdocument.addEventListenerます。このような状況では、ユーザーエージェントが最適なオプションです。


ブラウザが最新かどうかを検出する

ブラウザーがほとんどのHTML 5およびCSS 3標準をサポートしているかどうかにのみ関心がある場合は、IE 8以下が依然として問題の主要なアプリであると合理的に想定できます。のテストでwindow.getComputedStyleは、最新のブラウザ(IE 9、FF 4、Chrome 11、Safari 5、Opera 11.5)のかなり良い組み合わせも得られます。IE 9では標準サポートが大幅に改善されていますが、ネイティブCSSアニメーションにはIE 10が必要です。

var isModernBrowser = ( !document.all || ( document.all && document.addEventListener ) ); 

「User-AgentからIEバージョンを取得する」はうまく機能します!念のため、これはIE11を含むすべてのバージョンを表示しますか?
omer 2015

1
@omerはい、 "MSIE"または "Trident"という文字列を検索するためです。後者はIE 11以降で使用されます。そのため、MSがブラウザエンジンの名前を変更するまで、将来のすべてのIEバージョンで機能します。新しいEdgeブラウザはまだTridentを使用していると思います。
Beejor 2015

@Beejorに感謝します。私はあなたの答えを使用して別のページへの単純なリダイレクトを実装しました: var ie = 0; try { ie = navigator.userAgent.match( /(MSIE |Trident.*rv[ :])([0-9]+)/ )[ 2 ]; } catch(e){} if (ie !== 0) { location.href = "../ie-redirect/redirect.html"; }
BernardV

@BernardVよさそうです!簡単なヒント:サーバーにアクセスできる場合、スクリプトでユーザーエージェントを検出すると、ユーザーがリダイレクトやちらつきに気付かなかったり、HTTPリクエストが少なくなったりするため、より適切に動作する可能性があります。 JSも動作します。
Beejor

9

Angular JSはこのようにしています。

msie = parseInt((/msie (\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);
if (isNaN(msie)) {
  msie = parseInt((/trident\/.*; rv:(\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);
}

msieは、そのIEとNaNがchrome、firefoxなどの他のブラウザの場合、正の数になります。

どうして ?

Internet Explorer 11以降、ユーザーエージェント文字列は大幅に変更されました。

これを参照してください:

msdn#1 msdn#2


7

解決 :

function GetIEVersion() {
  var sAgent = window.navigator.userAgent;
  var Idx = sAgent.indexOf("MSIE");
  // If IE, return version number.
  if (Idx > 0)
    return parseInt(sAgent.substring(Idx+ 5, sAgent.indexOf(".", Idx)));

  // If IE 11 then look for Updated user agent string.
  else if (!!navigator.userAgent.match(/Trident\/7\./))
    return 11;

  else
    return 0; //It is not IE

}
if ((GetIEVersion() > 0) || (navigator.userAgent.toLowerCase().indexOf('firefox') > -1)){
  alert("This is IE " + GetIEVersion());
}else {
  alert("This no is IE ");
}		


1
私のお気に入り-IE6-10およびIE11のアカウント。エッジのチェックも追加しました
AlbatrossCafe

これは、Firefoxを次のように検出しますThis is IE 0
KSPR

3

私はより簡単な方法を使用しています:

ナビゲーターグローバルオブジェクトにはタッチポイントプロパティがあり、Internet Explorer 11ではmsMaxTouchPoints thoと呼ばれています。

だからあなたが探すなら:

navigator.msMaxTouchPoints !== void 0 

Internet Explorer 11があります。


1
IE 10(Win 7)のtrunも返します
ケミカルプログラマー

2
var ua = navigator.userAgent.toString().toLowerCase();
var match = /(trident)(?:.*rv:([\w.]+))?/.exec(ua) ||/(msie) ([\w.]+)/.exec(ua)||['',null,-1];
var rv = match[2];
return rv;

正規表現を使用してチェックする場合は、.toLowerCase()ではなく、iフラグを追加して大文字と小文字を区別しないようにすることができます。.toString()メソッドも必要ありません。
Jake Rowsell、2015年

2

これを試して:

var trident = !!navigator.userAgent.match(/Trident\/7.0/);
var net = !!navigator.userAgent.match(/.NET4.0E/);
var IE11 = trident && net
var IEold = ( navigator.userAgent.match(/MSIE/i) ? true : false );
if(IE11 || IEold){
alert("IE")
}else{
alert("Other")
}

Acooブラウザはユーザーエージェントで「MSIE」を使用しているため、コードが間違っています。useragentstring.com/pages/Acoo%20Browser
User

誤った議論。すべてのIEブラウザー、Win8デバイスもテストしました。
Krunal 14年

IE11ブラウザーをテストしましたがAcooブラウザーはテストしていません。Acooブラウザーはユーザーエージェントで「MSIE」を使用しているため、IEoldはAcooブラウザーをIEold(古いバージョンのIE)として検出し、Acooブラウザーは「 「MSIE」をuseragentに追加しました。これは、Acooブラウザーを使用したjavascriptテストサイト(テストサイト:w3schools.com)でnavigator.userAgentを実行したためです
ユーザー

これに対するより良い解決策を教えていただけますか?
Krunal 14

Uは使用できます!navigator.userAgent.match("Acoo Browser;") && navigator.userAgent.match(/MSIE/i) ? true : falseが、acooブラウザーには常に「Acooブラウザー」がないため、それが常に機能するとは限りません。そのuseragentにありますが、実際には、acooブラウザーはほとんど同じであるため、そのacooブラウザーのuseragentに「MSIE」が含まれていることを気にする必要はありません。
ユーザー

1

これはより良い方法のようです。「indexOf」は、何も一致しない場合、-1を返します。本文の既存のクラスを上書きせず、追加するだけです。

// add a class on the body ie IE 10/11
var uA = navigator.userAgent;
if(uA.indexOf('Trident') != -1 && uA.indexOf('rv:11') != -1){
    document.body.className = document.body.className+' ie11';
}
if(uA.indexOf('Trident') != -1 && uA.indexOf('MSIE 10.0') != -1){
    document.body.className = document.body.className+' ie10';
}

0

これでほとんどのブラウザを検出します:

var getBrowser = function(){
  var navigatorObj = navigator.appName,
      userAgentObj = navigator.userAgent,
      matchVersion;
  var match = userAgentObj.match(/(opera|chrome|safari|firefox|msie|trident)\/?\s*(\.?\d+(\.\d+)*)/i);
  if( match && (matchVersion = userAgentObj.match(/version\/([\.\d]+)/i)) !== null) match[2] = matchVersion[1];
  //mobile
  if (navigator.userAgent.match(/iPhone|Android|webOS|iPad/i)) {
    return match ? [match[1], match[2], mobile] : [navigatorObj, navigator.appVersion, mobile];
  }
  // web browser
  return match ? [match[1], match[2]] : [navigatorObj, navigator.appVersion, '-?'];
};

https://gist.github.com/earlonrails/5266945


0

onscrollスクロールバーのある要素でイベントを使用しました。IEでトリガーされたときに、次の検証を追加しました。

onscroll="if (document.activeElement==this) ignoreHideOptions()"

0

IEブラウザーのみ:

var ie = 'NotIE'; //IE5-11, Edge+
    if( !!document.compatMode ) {
        if( !("ActiveXObject" in window) ) ) ie = 'EDGE';
        if( !!document.uniqueID){
            if('ActiveXObject' in window && !window.createPopup ){ ie = 11; }
            else if(!!document.all){
                    if(!!window.atob){ie = 10;}
                    else if(!!document.addEventListener) {ie = 9;}
                    else if(!!document.querySelector){ie = 8;}
                    else if(!!window.XMLHttpRequest){ie = 7;}
                    else if(!!document.compatMode){ie = 6;}
                    else ie = 5;
                }
        }
    }

alert(ie)を使用します。

テスト:

var browserVersionExplorer = (function() {
    var ie = '<s>NotIE</s>',
        me = '<s>NotIE</s>';

    if (/msie\s|trident\/|edge\//i.test(window.navigator.userAgent) && !!(document.documentMode || document.uniqueID || window.ActiveXObject || window.MSInputMethodContext)) {
            if (!!window.MSInputMethodContext) {
                ie = !("ActiveXObject" in window) ? 'EDGE' : 11;
            } else if (!!document.uniqueID) {
                if (!!(window.ActiveXObject && document.all)) {
                    if (document.compatMode == "CSS1Compat" && !!window.DOMParser ) {
                        ie = !!window.XMLHttpRequest ? 7 : 6;
                    } else {
                        ie = !!(window.createPopup && document.getElementById) ? parseFloat('5.5') : 5;
                    }
                    if (!!document.documentMode && !!document.querySelector ) {
                        ie = !!(window.atob && window.matchMedia) ? 10 : ( !!document.addEventListener ? 9 : 8);
                    }
                } else ie = !!document.all ? 4 : (!!window.navigator ? 3 : 2);
            }
        }
        
    return ie > 1 ? 'IE ' + ie : ie;
})();

 alert(browserVersionExplorer);

2017年6月1日更新

これで、より簡単でシンプルなものを使用できます。

var uA = window.navigator.userAgent,
    onlyIEorEdge = /msie\s|trident\/|edge\//i.test(uA) && !!( document.uniqueID || window.MSInputMethodContext),
    checkVersion = (onlyIEorEdge && +(/(edge\/|rv:|msie\s)([\d.]+)/i.exec(uA)[2])) || NaN;

Edgeの新しいバージョンに追加された新しい標準グローバルオブジェクトはどこにありますか?Math.acoshもその1つだと思います。
j4v1

1
@ j4v1 Math.acoshのみがMicrosoft Edge(Edgeブラウザ)でサポートされています。参照:msdn.microsoft.com/en-us/en-en/library/dn858239(v
James Peter

この方法は私にとって機能しなくなりました。以前はIE11を正しく検出していましたが、Windows 10 Enterprise(バージョン1607、OSビルド14393.1198)でInternet Explorerバージョン11.1198.14393.0(アップデートバージョン11.0.42(KB4018271))を実行しているため、数学はacoshメソッドをサポートしているようです。
Thijs

@Thijs IE11 v 11.1198.14393.0を使用したWindows 10 Educationでは、テストに成功しました。ES6に従って別の数学関数を試してください。
James Peter

@JamesPeter document.documentModeをチェックして上陸しました。これは、IE11またはEdgeをチェックするためのより信頼できるプロパティのようです。documentModeはIE11に存在しますが、Edgeには存在しません。
Thijs 2017年

0

率直に言って、必要なことを実行するライブラリを使用すると思います(たとえば、platform.jsなど)。ある時点で状況が変わり、ライブラリはそれらの変更に対応できるようになり、正規表現を使用した手動の解析は失敗します。

IEがなくなる神に感謝...

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