web-dev-qa-db-ja.com

IE11を検出するには?

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を使っていません」と返しています。どうやってそれを検出できますか?

201
user2591042

この変更点の一覧 によると、IE11ではMSIEとして報告されなくなりました。これは誤検出を避けるためのものです。

本当に それがIEであることを知りたい場合は、Trident/Netscapeを返す場合、navigator.appName文字列をユーザーエージェントで検出することができます。

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)はまだプレビュー中であり、ユーザーエージェントはリリース前に変更される可能性があります。

213

IE11を明示的に検出するには!(window.ActiveXObject) && "ActiveXObject" in windowを使用してください。

IE(Edgeより前、 "Trident")のバージョンを検出するには、代わりに"ActiveXObject" in windowを使用してください。

85
mcw0933

機能検出チェックの一環としてMSInputMethodContextを使用してください。例えば:

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

参考文献

35
Paul Sweatte

私はあなたの答えを読み、ミックスを作りました。 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は意味しません。

15
Fabio

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

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

仕組み:ユーザーエージェント文字列 すべてのIEバージョン には、「MSIEspaceversion」または「Tridentother-textrvspace-or-colonversion」。これを知って、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の各バージョンは、以前のバージョンにはない 追加機能 のサポートを追加します。そのため、トップダウン方式で機能をテストできます。ここでは簡潔にするために ternary シーケンスを使用していますが、if-thenおよびswitchステートメントも同様に機能します。変数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 ) ); 
11
Beejor

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#1msdn#2

9
Vishal Sharma

解決策:

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 ");
}               
7
coperniko

私はもっ​​と簡単な方法を使っています。

ナビゲータグローバルオブジェクトはプロパティtouchpointsを持ち、Internet Exlorer 11ではmsMaxTouchPoints thoと呼ばれています。

あなたが探しているのであれば:

navigator.msMaxTouchPoints !== void 0 

あなたはInternet Explorer 11を見つけるでしょう。

3
Dvid Silva
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;
2
areschen

これを試して:

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")
}
2
Krunal

これはより良い方法のようです。何も一致しない場合、 "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';
}
1
joe

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

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
earlonrails

率直に言って、私はあなたが必要とすることをするライブラリを使うと言うでしょう(例えばplatform.jsのように)。ある時点で物事が変わり、ライブラリはそれらの変更に対応するでしょうし、正規表現を使った手動の解析は失敗するでしょう。

神に感謝IEは消えます...

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;
                }
        }
    }

警告を使用します(例)。

テスト:

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;
0
James Peter

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

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