Wie erkenne ich IE11?

212

Wenn ich IE erkennen möchte, verwende ich diesen Code:

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 gibt jedoch "Sie verwenden den Internet Explorer nicht" zurück. Wie kann ich es erkennen?

Paul Sweatte
quelle
1
Alles, was auf dem Benutzeragenten basiert, ist fehlerhaft. Es ist zu leicht zu fälschen. Nun mag es sein, dass dies kein Problem ist, aber es scheint mir, dass ein Browser-Erkennungsskript eine faire Chance haben sollte, Maskerading zu erkennen. Ich verwende eine Kombination aus bedingten Kommentaren, um zu versuchen, den document.documentMode zu erzwingen, und schaue dann auf window.MSInputMethodContext gemäß Paul Sweatte unten. Ich würde meinen Code posten, aber er peitscht ein totes Pferd aus.
David G
3
IE11 hat Benutzer-Agent: Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; rv: 11.0) wie Gecko Os Typen: 6.1 - win7, 6.3 - win81
Rasierer
1
siehe meine Antwort hier stackoverflow.com/questions/21825157/…
Royi Namir
1
Hier ist die beste Lösung, die ich gefunden habe: stackoverflow.com/a/20201867/2047385 if (Object.hasOwnProperty.call (Fenster, "ActiveXObject") &&! window.ActiveXObject) {// ist IE11}
xorcus

Antworten:

221

IE11 meldet nicht mehr, da MSIEgemäß dieser Liste von Änderungen beabsichtigt ist, eine Fehlerkennung zu vermeiden.

Was Sie tun können, wenn Sie wirklich wissen möchten, dass es sich um einen IE handelt, ist, die Trident/Zeichenfolge im Benutzeragenten zu erkennen , wenn sie navigator.appNamezurückgegeben wird Netscape, etwa (die nicht getestete);

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());

Beachten Sie, dass sich IE11 (afaik) noch in der Vorschau befindet und sich der Benutzeragent möglicherweise vor der Veröffentlichung ändert.

Joachim Isaksson
quelle
81
it's intentional to avoid mis-detection- Leider haben wir jetzt, da IE11 veröffentlicht ist, Code, der nur in IE11 defekt ist, während eine korrekte Erkennung von IE funktioniert hätte ...
Izkata
68
Ich habe diese Lösung in einen Booleschen Wert konvertiert, wenn die Version weniger wichtig istfunction 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 - Gemäß der HTML5-Spezifikation hier folgt der IE tatsächlich dem Standard. Also ja, es ist beabsichtigt, aber es entspricht dem neuen Standard (der die alte HTML-API ablehnt)
Mark Avenius
11
"Der Grund, warum sie dies getan haben, war absichtlich. Sie wollten Browser-Erkennungsskripte wie dieses brechen." von stackoverflow.com/a/18872067/1066234 ... Eigentlich sollte es sein: "Sie wollten Milliarden Websites so kaputt machen."
Kai Noack
15
Das funktioniert bei mir: var isIE11 = !!navigator.userAgent.match(/Trident\/7\./); Quelle
Kai Noack
86

Verwenden Sie !(window.ActiveXObject) && "ActiveXObject" in windowdiese Option, um IE11 explizit zu erkennen.

Verwenden Sie "ActiveXObject" in windowstattdessen eine IE-Version (Pre-Edge, "Trident") .

mcw
quelle
2
Dieser Microsoft-Artikel schlägt vor, dass diese Lösung möglicherweise nicht mehr funktioniert msdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx
Alan
5
In diesem Artikel wird der Grund beschrieben, warum meine Methode funktioniert. Der window.ActiveXObjectim Artikel beschriebene undefinedZugriffsversuch wird jetzt in IE11 (sowie in Nicht-Microsoft-Browsern) zurückgegeben. Der Test mit dem Javascript- inOperator wird truein allen Microsoft-Browsern zurückgegeben, sodass beide ausschließlich in IE11 der Fall sind. Wenn Microsoft das Verhalten des inOperators ändert , wird diese Methode unterbrochen.
mcw
5
"ActiveXObject" im Fenster gibt False in Edge zurück.
Neo
8
@Neo Edge ist nicht IE, die Frage des OP war, wie IE11
Mastazi
1
@mastazi ja, aber in dieser Antwort wird erwähnt, dass ActiveXObject verwendet werden kann, um jede IE-Version zu erkennen. Es ist zwar fraglich, ob Edge als IE-Version bezeichnet werden soll oder nicht (Microsoft möchte es sicherlich nicht als eine bezeichnen), aber für viele Entwickler ist IE zum Synonym für jeden Standard-Microsoft-Browser geworden.
Neo
45

Verwendung MSInputMethodContextals Teil einer Funktionserkennungsprüfung. Beispielsweise:

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

Verweise

Paul Sweatte
quelle
2
Dies scheint mir robuster zu sein. Sicherlich ist alles, was auf User Agent basiert, ziemlich nutzlos.
David G
1
Das funktioniert anstelle von ActiveXObject. Vielen Dank
Tarık Özgün Güner
1
@tdakhla Aktualisiert, um IE Edge herauszufiltern.
Paul Sweatte
Es ist wichtig zu beachten, dass für jede dieser Antworten, die möglicherweise nicht funktionieren, die Emulationseinstellungen überprüft werden. Ich wollte diese Antwort als falsch markieren, habe dann aber die Emulation überprüft und festgestellt, dass einige Intranet-Kompatibilitätseinstellungen den Anzeigemodus überschreiben Sobald dies aus der Gleichung herausgenommen wurde, funktionierte diese Lösung gut für mich.
Shaun
1
Gerade bestätigt #falsein Nicht-IE, IE8,9,10, Edge 14,15. #truenur in IE11. Wurde nicht mit aktivem Dokumentmodus getestet. Getestet mit Browserstack.
Danjah
15

Ich habe deine Antworten gelesen und eine Mischung gemacht. Es scheint mit Windows XP (IE7 / IE8) und Windows 7 (IE9 / IE10 / IE11) zu funktionieren.

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

Wenn ich 0 zurückgebe, bedeutet das natürlich keinen IE.

Fabio
quelle
12

Holen Sie sich die IE-Version vom User-Agent

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

So funktioniert es: Die User-Agent-Zeichenfolge für alle IE-Versionen enthält einen Teil "MSIE Space- Version " oder "Trident Other -Text- RV- Space-or-Colon- Version ". In diesem Wissen greifen wir auf die Versionsnummer eines String.match()regulären Ausdrucks zurück. Ein try-catchBlock wird verwendet, um den Code zu verkürzen, andernfalls müssten wir die Array-Grenzen für Nicht-IE-Browser testen.

Hinweis: Der Benutzeragent kann gefälscht oder weggelassen werden, manchmal unbeabsichtigt, wenn der Benutzer seinen Browser auf einen "Kompatibilitätsmodus" eingestellt hat. Dies scheint jedoch in der Praxis kein großes Problem zu sein.


Holen Sie sich die IE-Version ohne den User-Agent

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

So funktioniert es: Jede IE-Version bietet Unterstützung für zusätzliche Funktionen , die in früheren Versionen nicht vorhanden waren. So können wir die Funktionen von oben nach unten testen. Der Kürze halber wird hier jedoch eine ternäre Sequenz verwendet, if-thenund switchAnweisungen würden genauso gut funktionieren. Die Variable iewird auf eine Ganzzahl 5-11 oder 1 für ältere oder 99 für neuere / Nicht-IE gesetzt. Sie können es auf 0 setzen, wenn Sie nur genau auf IE 1-11 testen möchten.

Hinweis: Die Objekterkennung kann unterbrochen werden, wenn Ihr Code auf einer Seite mit Skripten von Drittanbietern ausgeführt wird, die Polyfills für Dinge wie hinzufügen document.addEventListener. In solchen Situationen ist der Benutzeragent die beste Option.


Ermitteln Sie, ob der Browser modern ist

Wenn Sie nur daran interessiert sind, ob ein Browser die meisten HTML 5- und CSS 3-Standards unterstützt oder nicht, können Sie davon ausgehen, dass IE 8 und niedriger die Hauptproblem-Apps bleiben. Wenn Sie auf window.getComputedStyletesten, erhalten Sie auch eine ziemlich gute Mischung aus modernen Browsern (IE 9, FF 4, Chrome 11, Safari 5, Opera 11.5). IE 9 verbessert die Standardunterstützung erheblich, für native CSS-Animationen ist jedoch IE 10 erforderlich.

var isModernBrowser = ( !document.all || ( document.all && document.addEventListener ) ); 
Beejor
quelle
Die 'IE-Version vom User-Agent abrufen' funktioniert gut! Nur um sicher zu gehen, zeigt dies alle Versionen einschließlich IE11?
Omer
1
@omer Ja, weil es nach der Zeichenfolge "MSIE" oder "Trident" sucht; Letzteres wird von IE 11 und höher verwendet. Es funktioniert also für alle zukünftigen IE-Versionen, bis MS den Namen seiner Browser-Engine ändert. Ich glaube, der neue Edge-Browser verwendet immer noch Trident.
Beejor
Das funktioniert super, danke @Beejor! Ich habe eine einfache Weiterleitung auf eine andere Seite mit Ihrer Antwort implementiert: 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 Sieht gut aus! Ein kurzer Tipp: Wenn Sie Zugriff auf den Server haben, funktioniert das Erkennen des Benutzeragenten in einem Skript dort möglicherweise besser, da der Benutzer keine Umleitung / Flimmern, weniger HTTP-Anforderungen usw. bemerkt. Aber zur Not JS funktioniert auch.
Beejor
9

Angular JS macht das so.

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

msie wird eine positive Zahl sein, wenn sein IE und NaN für andere Browser wie Chrome, Firefox.

Warum ?

Ab Internet Explorer 11 hat sich die Zeichenfolge des Benutzeragenten erheblich geändert.

Verweisen Sie darauf:

msdn # 1 msdn # 2

Vishal Sharma
quelle
7

Lösung:

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

Coperniko
quelle
1
Mein Favorit - Konten für IE6-10 und IE11. Ich habe auch einen Check für Edge hinzugefügt
AlbatrossCafe
Dies erkennt Firefox alsThis is IE 0
KSPR
3

Ich benutze eine einfachere Methode:

Das globale Navigatorobjekt verfügt über Eigenschaftsberührungspunkte. In Internet Exlorer 11 heißt es msMaxTouchPoints tho.

Also, wenn Sie suchen nach:

navigator.msMaxTouchPoints !== void 0 

Sie finden Internet Explorer 11.

Dvid Silva
quelle
1
Es gibt auch Trun auf IE 10 (Win 7)
Chemical Programmer
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;
areschen
quelle
Wenn Sie einen Regex zum Überprüfen verwenden, können Sie das i-Flag hinzufügen, um die Groß- und Kleinschreibung nicht zu berücksichtigen, anstatt .toLowerCase (). Die Methode .toString () ist ebenfalls nicht erforderlich.
Jake Rowsell
2

Versuche dies:

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")
}
Krunal
quelle
Falscher Code, da der Acoo-Browser "MSIE" im Useragent verwendet. Schauen Sie sich useragentstring.com/pages/Acoo%20Browser
User
FALSCHES ARGUMENT. Ich habe in allen IE-Browsern getestet, auch in Win8-Geräten.
Krunal
Sie haben den IE11-Browser getestet, aber nicht den Acoo-Browser, und der Acoo-Browser verwendet "MSIE" im Useragent, wie ich bereits sagte, sodass der IEold den Acoo-Browser auch als IEold (die alte Version des IE) erkennt und ich bin sicher, dass der Acoo-Browser " MSIE "im Useragent, weil ich navigator.userAgent auf einer Javascript-Testseite mit Acoo-Browser ( Testseite : w3schools.com ) ausgeführt habe
Benutzer
Können Sie bitte eine bessere Lösung dafür geben?
Krunal
Sie können verwenden, !navigator.userAgent.match("Acoo Browser;") && navigator.userAgent.match(/MSIE/i) ? true : falseaber das funktioniert nicht immer, da der acoo-Browser nicht immer über "Acoo Browser" verfügt. in seinem Useragent, aber eigentlich müssen Sie sich nicht darum kümmern, dass der acoo-Browser "MSIE" in seinem useragent hat, da der acoo-Browser fast derselbe ist.
Benutzer
1

Dies scheint eine bessere Methode zu sein. "indexOf" gibt -1 zurück, wenn nichts übereinstimmt. Bestehende Klassen im Body werden nicht überschrieben, sondern nur hinzugefügt.

// 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';
}
Joe
quelle
0

Erkennen Sie die meisten Browser damit:

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

Earlonrails
quelle
0

Ich habe das onscrollEreignis am Element mit der Bildlaufleiste verwendet. Beim Auslösen im IE habe ich die folgende Validierung hinzugefügt:

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

Nur für IE Browser:

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

Alarm verwenden (dh);

Testen:

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

Update 01. Juni 2017

Jetzt könnten wir etwas einfacher und einfacher gebrauchen:

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;
James Peter
quelle
Wo finde ich die neuen globalen Standardobjekte, die neuen Versionen von Edge hinzugefügt wurden? Ich schließe daraus, dass Math.acosh einer von denen ist.
j4v1
1
@ j4v1 Nur Math.acosh wird in Microsoft Edge (Edge-Browser) unterstützt. Ref: msdn.microsoft.com/en-us/en-en/library/dn858239(v=vs.94).aspx
James Peter
Diese Methode hat bei mir aufgehört zu arbeiten. In der Vergangenheit wurde IE11 korrekt erkannt, aber jetzt, da ich Internet Explorer Version 11.1198.14393.0 (Update Version 11.0.42 (KB4018271)) unter Windows 10 Enterprise (Version 1607, OS Build 14393.1198) habe, scheint Math die Acosh-Methode zu unterstützen.
Thijs
@Thijs In Windows 10 Education mit IE11 v 11.1198.14393.0 habe ich erfolgreich getestet. Sie sollten eine andere mathematische Funktion gemäß ES6 ausprobieren.
James Peter
@ JamesPeter Ich bin gelandet, als ich nach document.documentMode gesucht habe. Dies scheint eine zuverlässigere Eigenschaft zu sein, um nach IE11 oder Edge zu suchen. documentMode ist in IE11 vorhanden, in Edge jedoch nicht mehr.
Thijs
0

Ehrlich gesagt würde ich sagen, verwenden Sie eine Bibliothek, die das tut, was Sie brauchen (wie zum Beispiel platform.js). Irgendwann werden sich die Dinge ändern und die Bibliothek wird für diese Änderungen ausgestattet sein, und das manuelle Parsen mit regulären Ausdrücken schlägt fehl.

Gott sei Dank geht IE weg ...

Matthias Hryniszak
quelle