Erkennen Sie die IE-Version (vor Version 9) in JavaScript

246

Ich möchte Benutzer unserer Website auf eine Fehlerseite Internet Explorerleiten, wenn sie eine Version vor Version 9 verwenden. Es ist einfach nicht unsere Zeit und unser Geld wert, um zu unterstützen IE pre-v9. Benutzer aller anderen Nicht-IE-Browser sind in Ordnung und sollten nicht zurückgeworfen werden. Hier ist der vorgeschlagene Code:

if(navigator.appName.indexOf("Internet Explorer")!=-1){     //yeah, he's using IE
    var badBrowser=(
        navigator.appVersion.indexOf("MSIE 9")==-1 &&   //v9 is ok
        navigator.appVersion.indexOf("MSIE 1")==-1  //v10, 11, 12, etc. is fine too
    );

    if(badBrowser){
        // navigate to error page
    }
}

Wird dieser Code den Trick machen?

Um ein paar Kommentare abzuwenden, die mir wahrscheinlich in den Weg kommen werden:

  1. Ja, ich weiß, dass Benutzer ihre useragentZeichenfolge fälschen können . Ich bin nicht besorgt.
  2. Ja, ich weiß, dass Programmierprofis es vorziehen, die Unterstützung von Funktionen anstelle des Browsertyps auszuspionieren, aber ich halte diesen Ansatz in diesem Fall nicht für sinnvoll. Ich weiß bereits, dass alle (relevanten) Nicht-IE-Browser die Funktionen unterstützen, die ich benötige, und dass alle pre-v9 IEBrowser dies nicht tun. Das Überprüfen von Merkmal zu Merkmal auf der gesamten Website wäre eine Verschwendung.
  3. Ja, ich weiß, dass jemand, der versucht, mit IE v1(oder> = 20) auf die Site zuzugreifen , 'badBrowser' nicht auf true gesetzt hat und die Warnseite nicht richtig angezeigt wird. Das ist ein Risiko, das wir eingehen wollen.
  4. Ja, ich weiß, dass Microsoft "bedingte Kommentare" hat, die zur präzisen Erkennung von Browserversionen verwendet werden können. IE unterstützt ab sofort keine bedingten Kommentare mehr IE 10, was diesen Ansatz absolut nutzlos macht.

Gibt es noch andere offensichtliche Probleme, die Sie beachten sollten?

Chad Decker
quelle
122
"Es ist einfach nicht unsere Zeit und unser Geld wert, IE vor Version 9 zu unterstützen." Ich wünschte ich könnte das machen.
Hassan
2
Basierend auf Punkt [2] werde ich Modernizr ( en.wikipedia.org/wiki/Modernizr ) nicht vorschlagen - jeder muss irgendwo eine Linie in den Sand ziehen - aber IE9 scheint eine hohe Linie zu sein
amelvin
1
Bedingte Kommentare sind nur normale Kommentare. Nur der IE interpretiert sie als besondere. IE10 + macht das nicht mehr.
Andreas
3
Bedingte Kommentare werden von IE 10 genauso behandelt wie Nicht-IE-Browser. Sie sind gültige HTML-Kommentare und werden daher als solche behandelt. Ich stimme Andreas zu und denke, dass bedingte Kommentare der richtige Weg sind.
Tim Down
1
Die offizielle Dokumentation besagt, dass IE10 + keine bedingten Kommentare unterstützt: blogs.msdn.com/b/ie/archive/2011/07/06/… - Dank an: stackoverflow.com/a/9900331/320399
blong

Antworten:

354

Dies ist meine bevorzugte Methode. Es gibt maximale Kontrolle. (Hinweis: Bedingte Anweisungen werden nur in IE5 - 9 unterstützt.)

Richten Sie zuerst Ihre dh Klassen richtig ein

<!DOCTYPE html>
<!--[if lt IE 7]> <html class="lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>    <html class="lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>    <html class="lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html> <!--<![endif]-->    
<head>

Dann können Sie einfach CSS verwenden, um Stilausnahmen zu machen, oder bei Bedarf können Sie einfaches JavaScript hinzufügen:

(function ($) {
    "use strict";

    // Detecting IE
    var oldIE;
    if ($('html').is('.lt-ie7, .lt-ie8, .lt-ie9')) {
        oldIE = true;
    }

    if (oldIE) {
        // Here's your JS for IE..
    } else {
        // ..And here's the full-fat code for everyone else
    }

}(jQuery));

Vielen Dank an Paul Irish .

Jezen Thomas
quelle
21
Angesichts der Tatsache, dass das OP nach einer reinen JavaScript-Lösung gefragt hat, glaube ich, dass die Antwort von @Tim Down unten besser ist, da der vorhandene HTML- Code
AsGoodAsItGets
Ich erhalte eine Fehlermeldung auf w3 html Error: Saw <!-- within a comment. Probable cause: Nested comment (not allowed). At line 5, column 21 if gt IE 8]><!--><html
validator
161

IE-Version zurückgeben oder wenn nicht IE false zurückgeben

function isIE () {
  var myNav = navigator.userAgent.toLowerCase();
  return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
}

Beispiel:

if (isIE () == 8) {
 // IE8 code
} else {
 // Other versions IE or not IE
}

oder

if (isIE () && isIE () < 9) {
 // is IE version less than 9
} else {
 // is IE 9 and later or not IE
}

oder

if (isIE()) {
 // is IE
} else {
 // Other browser
}
weroro
quelle
36
Funktioniert nicht für IE11. Von IE 11 haben sie die UA-Zeichenfolge in"mozilla/5.0 (windows nt 6.3; wow64; trident/7.0; .net4.0e; .net4.0c; media center pc 6.0; .net clr 3.5.30729; .net clr 2.0.50727; .net clr 3.0.30729; rv:11.0) like gecko"
Annie
22
Bitte beachten Sie, dass in FF "false <9" "true" ist. Also, Bedingung sollte seinif (isIE () && isIE () < 9) {
nZeus
3
@DeadlyChambers Vielleicht lief es im IE7-Standardmodus? msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
mason81
4
Die genehmigte Antwort lautet, wie die IE-Version in HTML erkannt wird. Dies beantwortet die ursprüngliche Frage.
Matt Wagner
2
@PrasadGayan - Microsoft Edge ist kein Internet Explorer. Die Rückgabe von false scheint also das Richtige zu sein.
BryanGrezeszak
120

Wenn niemand eine addEventListerMethode hinzugefügt hat und Sie den richtigen Browsermodus verwenden, können Sie mit nach IE 8 oder weniger suchen

if (window.attachEvent && !window.addEventListener) {
    // "bad" IE
}

Legacy Internet Explorer und attachEvent (MDN)

Andreas
quelle
7
Dies scheint der effizienteste Weg zu sein, um IE <= 8 vollständig in JavaScript zu erkennen - und ist ideal für Leute wie mich, die nach einem Weg suchen, dies zu tun.
Gregory Magarshak
Toll! Dadurch wird auch IE9 im Quirks-Modus erkannt, nach dem ich gesucht habe.
sstur
7
Obwohl dies eine "einfach zu verwendende" Lösung ist, birgt sie einige Risiken. Jeder in Ihrem Unternehmen (der Ihre Lösung nicht kennt) kann "addEventListener" oder "attachEvent" implementieren, um das Fehlen in IE 8 zu beheben. Anschließend funktioniert Ihr Code nicht mehr.
Zé Carlos
@ RoyiNamir Dieser Test für IE8. Warum um alles in der Welt sollte es auf IE11 wahr sein?
Andreas
@Andreas oops. habe nicht gesehen, dass OP vor ie9 will. Löschen.
Royi Namir
114

Verwenden Sie bedingte Kommentare. Sie versuchen, Benutzer von IE <9 zu erkennen, und bedingte Kommentare funktionieren in diesen Browsern. In anderen Browsern (IE> = 10 und Nicht-IE) werden die Kommentare als normale HTML-Kommentare behandelt.

Beispiel HTML:

<!--[if lt IE 9]>
WE DON'T LIKE YOUR BROWSER
<![endif]-->

Sie können dies auch nur mit Skript tun, wenn Sie Folgendes benötigen:

var div = document.createElement("div");
div.innerHTML = "<!--[if lt IE 9]><i></i><![endif]-->";
var isIeLessThan9 = (div.getElementsByTagName("i").length == 1);
if (isIeLessThan9) {
    alert("WE DON'T LIKE YOUR BROWSER");
}
Tim Down
quelle
5
Die JavaScript-Version der Antwort von @Tim Down hat für mich hervorragend funktioniert. Ich habe BrowserStack verwendet, um es mit Windows 7 und IE 8, 9, 10 und 11 zu testen. Mac OS X Snow Leopard mit Safari 5.1, Firefox 28.0, Chrome 33.0 und Opera 20.0; iPhone 5 Mobile Safari; und Android Samsung Galaxy Tab 2 10.1 4.0. Wie erwartet meldete nur IE8, dass es sich um IeLessThan9 handelte. Nett!
Steve Saporta
58

So erkennen Sie MSIE (v6 - v7 - v8 - v9 - v10 - v11) auf einfache Weise:

if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) {
   // MSIE
}
EpokK
quelle
Nützlich zum Erkennen von IE10, da es keine bedingten Kommentare unterstützt. Funktioniert nicht in IE11, aber IE11 hat im Allgemeinen ein gutes Verhalten
personne3000
11
Endlich eine Antwort, die nicht über die Verwendung der Feature-Erkennung spricht und die Frage tatsächlich beantwortet.
CDMckay
32

Hier ist die Art und Weise AngularJS Kontrollen für IE

/**
 * documentMode is an IE-only property
 * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
 */
var msie = document.documentMode;

if (msie < 9) {
    // code for IE < 9
}
iurii
quelle
Wow, das ist so viel einfacher als alle bedingten Kommentare! Keine Einschränkungen?
Andrewb
Laut den Dokumenten unterstützt IE8 + diese Eigenschaft, daher denke ich, dass dies für die meisten Fälle ausreichend sein sollte.
iurii
Gemäß der MSDN-Referenz "Wenn das aktuelle Dokument noch nicht ermittelt wurde, gibt documentMode den Wert Null (0) zurück. Dies geschieht normalerweise, wenn ein Dokument geladen wird." Bedeutet dies, dass Sie möglicherweise keine gültige Antwort in einem in <head> geladenen Skript erhalten?
Erik Knowles
Ich denke, Sie können es beheben, indem Sie den Wert in window.onload überprüfen, wenn das Dokument bereits geladen ist.
iurii
19

Erkennen der IE-Version mithilfe der Funktionserkennung (IE6 +, Browser vor IE6 werden als 6 erkannt, gibt für Nicht-IE-Browser null zurück):

var ie = (function (){
    if (window.ActiveXObject === undefined) return null; //Not IE
    if (!window.XMLHttpRequest) return 6;
    if (!document.querySelector) return 7;
    if (!document.addEventListener) return 8;
    if (!window.atob) return 9;
    if (!document.__proto__) return 10;
    return 11;
})();

Bearbeiten: Ich habe ein Bower / Npm-Repo für Ihre Bequemlichkeit erstellt: dh-Version

Aktualisieren:

Eine kompaktere Version kann in einer Zeile geschrieben werden als:

return window.ActiveXObject === undefined ? null : !window.XMLHttpRequest ? 6 : !document.querySelector ? 7 : !document.addEventListener ? 8 : !window.atob ? 9 : !document.__proto__ ? 10 : 11;
Gabriel Llamas
quelle
16

Diese Funktion gibt die Hauptversionsnummer des IE als Ganzzahl zurück oder undefinedwenn der Browser nicht Internet Explorer ist. Dies ist, wie alle Benutzeragentenlösungen, für das Spoofing von Benutzeragenten geeignet (das seit Version 8 eine offizielle Funktion des IE ist).

function getIEVersion() {
    var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:)(\d+)/);
    return match ? parseInt(match[1]) : undefined;
}
Owen
quelle
Owen, wie nutzt man das in der Praxis? Wie ruft man den Rückgabewert ab? Ich habe es versucht console.log(!!match && parseInt(match[1])), console.log(parseInt(match[1]))und console.log(match), aber kein Ergebnis mit einem von ihnen.
Frank Conijn
Rufen Sie den Rückgabewert ab, indem Sie die Funktion selbst aufrufen getIEVersion(). Zum Beispiel:if (getIEVersion() < 9) {/* IE 8 or below */} if (!getIEVersion()) {/* Not IE */}
Owen
15

Erkennen Sie den IE in JS anhand von bedingten Kommentaren

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

}());
jKey
quelle
Das ist so ziemlich das Gleiche wie meine Antwort.
Tim Down
@ TimDown: Vielleicht, aber diese Antwort ist etwas vollständiger (sie gibt die Versionsnummer an) und ist gut kommentiert. Darüber hinaus führt der Link am Anfang dieser Antwort zu einem Kern mit mehreren informativen Kommentaren und interessanten Variationen dieser Technik.
Alan
@ Alan: Faire Punkte. Ich habe meine auf die Frage zugeschnitten, aber die Quelle nicht zitiert.
Tim Down
12

Das funktioniert bei mir. Ich verwende es als Weiterleitung zu einer Seite, die erklärt, warum wir <IE9 nicht mögen, und Links zu Browsern bereitstellt, die wir bevorzugen.

<!--[if lt IE 9]>
<meta http-equiv="refresh" content="0;URL=http://google.com">
<![endif]-->
iconMatrix
quelle
1
Ohw, das ist böse. Ich benutze eine freundlichere Methode, zeige ein Div mit dem Aussehen einer IE-Warnung an und wenn der Besucher darauf klickt, geht der Benutzer zu browserehappy.com
Codebeat
10

Ihr Code kann die Überprüfung durchführen. Wenn jedoch jemand versucht, mit IE v1 oder> v19 auf Ihre Seite zuzugreifen, wird der Fehler nicht angezeigt. Führen Sie die Überprüfung daher möglicherweise sicherer mit dem Regex-Ausdruck wie dem folgenden Code durch:

var userAgent = navigator.userAgent.toLowerCase();
// Test if the browser is IE and check the version number is lower than 9
if (/msie/.test(userAgent) && 
    parseFloat((userAgent.match(/.*(?:rv|ie)[\/: ](.+?)([ \);]|$)/) || [])[1]) < 9) {
  // Navigate to error page
}
Fong-Wan Chau
quelle
Dies ist keine gute Antwort. UA-Schnüffeln ist unzuverlässig. Mehr dazu hier: modernizr.com/docs
Jezen Thomas
3
@ Jezen Manchmal ist UA-Schnüffeln der richtige Weg: github.com/Modernizr/Modernizr/issues/538
István Ujj-Mészáros
8

Bedingte Kommentare werden im IE ab Version 10 nicht mehr unterstützt, wie auf der Microsoft-Referenzseite angegeben .

var ieDetector = function() {
  var browser = { // browser object

      verIE: null,
      docModeIE: null,
      verIEtrue: null,
      verIE_ua: null

    },
    tmp;

  tmp = document.documentMode;
  try {
    document.documentMode = "";
  } catch (e) {};

  browser.isIE = typeof document.documentMode == "number" || eval("/*@cc_on!@*/!1");
  try {
    document.documentMode = tmp;
  } catch (e) {};

  // We only let IE run this code.
  if (browser.isIE) {
    browser.verIE_ua =
      (/^(?:.*?[^a-zA-Z])??(?:MSIE|rv\s*\:)\s*(\d+\.?\d*)/i).test(navigator.userAgent || "") ?
      parseFloat(RegExp.$1, 10) : null;

    var e, verTrueFloat, x,
      obj = document.createElement("div"),

      CLASSID = [
        "{45EA75A0-A269-11D1-B5BF-0000F8051515}", // Internet Explorer Help
        "{3AF36230-A269-11D1-B5BF-0000F8051515}", // Offline Browsing Pack
        "{89820200-ECBD-11CF-8B85-00AA005B4383}"
      ];

    try {
      obj.style.behavior = "url(#default#clientcaps)"
    } catch (e) {};

    for (x = 0; x < CLASSID.length; x++) {
      try {
        browser.verIEtrue = obj.getComponentVersion(CLASSID[x], "componentid").replace(/,/g, ".");
      } catch (e) {};

      if (browser.verIEtrue) break;

    };
    verTrueFloat = parseFloat(browser.verIEtrue || "0", 10);
    browser.docModeIE = document.documentMode ||
      ((/back/i).test(document.compatMode || "") ? 5 : verTrueFloat) ||
      browser.verIE_ua;
    browser.verIE = verTrueFloat || browser.docModeIE;
  };

  return {
    isIE: browser.isIE,
    Version: browser.verIE
  };

}();

document.write('isIE: ' + ieDetector.isIE + "<br />");
document.write('IE Version Number: ' + ieDetector.Version);

dann benutze:

if((ieDetector.isIE) && (ieDetector.Version <= 9))
{

}
Arnold.Krumins
quelle
1
Dies war das einzige, was im gesamten Netz funktionierte, zumindest der Humongus der Dinge, die ich ausprobiert habe ... Danke;)
Henrique C.
Dieser Code ist gut, kann jedoch den Kompatibilitätsansichtsmodus nicht erkennen. Ich bin auf IE 11 und verwende die Kompatibilitätsansicht in IE 8. Dieser Code gibt immer noch version 11EDIT: Dieser Code ist ERSTAUNLICH! haha, es gibt ein Objekt mit allem im Inneren. Version ist 11, aber docModeIR ist gleich 9. Danke!
MarceloBarbosa
5

Für dh 10 und 11:

Sie können js verwenden und eine Klasse in HTML hinzufügen, um den Standard der bedingten Kommentare beizubehalten :

  var ua = navigator.userAgent,
      doc = document.documentElement;

  if ((ua.match(/MSIE 10.0/i))) {
    doc.className = doc.className + " ie10";

  } else if((ua.match(/rv:11.0/i))){
    doc.className = doc.className + " ie11";
  }

Oder verwenden Sie eine Bibliothek wie Bowser:

https://github.com/ded/bowser

Oder modernizr zur Merkmalserkennung:

http://modernizr.com/

Liko
quelle
2
Ich habe ein paar Skripte und Lösungen ausprobiert, aber nichts hat funktioniert. Dann habe ich Bowser in das Projekt aufgenommen und es hat einfach funktioniert. Also eins für den Vorschlag von Bowser.
Moulde
3

Um Internet Explorer 10 | 11 zu erkennen, können Sie dieses kleine Skript unmittelbar nach dem Body-Tag verwenden:

In meinem Fall verwende ich die in head geladene jQuery-Bibliothek.

<!DOCTYPE HTML>
<html>
<head>
    <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
</head>
<body>
    <script>if (navigator.appVersion.indexOf('Trident/') != -1) $("body").addClass("ie10");</script>
</body>
</html>
Brian
quelle
Ich mag das, danke, ich muss nur 10 oder 11 erkennen, da ich
frühere
IE9 ist ebenfalls dreizackig, jedoch nicht identisch mit CSS-Unterstützung. Ihre Erkennung geht von mindestens 10 aus, aber das ist nicht korrekt.
Codebeat
3

Dies wurde zu Tode beantwortet, aber das ist alles was Sie brauchen.

!!navigator.userAgent.match(/msie\s[5-8]/i)
Timothy Perez
quelle
Hier ist auch eine Sandbox, die das Regex-Muster für die häufigsten IE-Benutzeragentenzeichenfolgen zeigt: regex101.com/r/lC6oP3/1
Timothy Perez
@alessadro - Aber es soll, nicht wahr? OP wollte für <9 ...
nnnnnn
2
var Browser = new function () {
    var self = this;
    var nav = navigator.userAgent.toLowerCase();
    if (nav.indexOf('msie') != -1) {
        self.ie = {
            version: toFloat(nav.split('msie')[1])
        };
    };
};


if(Browser.ie && Browser.ie.version > 9)
{
    // do something
}
Berezh
quelle
2

Laut Microsoft ist das Folgende die beste Lösung, es ist auch sehr einfach:

function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
    var rv = -1; // Return value assumes failure.
    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 )
    {
        if ( ver >= 8.0 ) 
            msg = "You're using a recent copy of Internet Explorer."
        else
            msg = "You should upgrade your copy of Internet Explorer.";
      }
    alert( msg );
}
AHH
quelle
In der Tat funktioniert der Code in einer späteren Antwort für IE11 ( stackoverflow.com/a/26375930/1129926 ), falls jemand anderes hier landet und versucht, das oben Genannte zu verwenden . Aber Vorsicht, funktioniert es für IE12 usw.? Unter dem Strich ist es am besten, diese als temporäre Hacks zu betrachten, und sie werden wahrscheinlich später fehlschlagen, wenn neue Browserversionen veröffentlicht werden (ich werde Edge nicht einmal erwähnen).
Jeff Mergler
1

Ich werde empfehlen, diesen Code nicht zum x-ten Mal neu zu schreiben. Ich würde empfehlen, dass Sie die Conditionizr-Bibliothek ( http://conditionizr.com/) verwenden. ) zu verwenden, mit der bestimmte IE-Versionen sowie andere Browser, Betriebssysteme und sogar das Vorhandensein oder Fehlen von Retina-Anzeigen getestet werden können.

Fügen Sie den Code nur für die spezifischen Tests ein, die Sie benötigen, und Sie profitieren von einer getesteten Bibliothek, die viele Iterationen durchlaufen hat (und die leicht aktualisiert werden kann, ohne Ihren Code zu beschädigen).

Es passt auch gut zu Modernizr, das all die Fälle bewältigen kann, in denen Sie besser auf eine bestimmte Funktion als auf einen bestimmten Browser testen sollten.

John Munsch
quelle
1

Das gefällt mir:

<script>
   function isIE () {
       var myNav = navigator.userAgent.toLowerCase();
       return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
   }    
   var ua = window.navigator.userAgent;
   //Internet Explorer | if | 9-11

   if (isIE () == 9) {
       alert("Shut down this junk! | IE 9");
   } else if (isIE () == 10){
       alert("Shut down this junk! | IE 10");
   } else if (ua.indexOf("Trident/7.0") > 0) {
       alert("Shut down this junk! | IE 11");
   }else{
       alert("Thank god it's not IE!");
   }

</script>
Julio Cesar Boaroli
quelle
1

Dieser Ansatz zur Erkennung des IE kombiniert die Stärken und vermeidet die Schwächen der Antwort von jKey mithilfe von bedingten Kommentaren und der Antwort von Owen mithilfe von Benutzeragenten.

  • Der Ansatz von jKey funktioniert bis Version 9 und ist immun gegen Spoofing von Benutzeragenten in IE 8 und 9.
  • Owens Ansatz kann in IE 5 und 6 fehlschlagen (Bericht 7) und ist anfällig für UA-Spoofing, kann jedoch IE-Versionen> = 10 erkennen (jetzt auch 12, was Owens Antwort nachdatiert).

    // ----------------------------------------------------------
    // A short snippet for detecting versions of IE
    // ----------------------------------------------------------
    // If you're not in IE (or IE version is less than 5) then:
    //     ie === undefined
    // Thus, to detect IE:
    //     if (ie) {}
    // And to detect the version:
    //     ie === 6 // IE6
    //     ie > 7 // IE8, IE9 ...
    // ----------------------------------------------------------
    var ie = (function(){
        var v = 3,
            div = document.createElement('div'),
            all = div.getElementsByTagName('i');
    
        while (
            div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
            all[0]
        );
        if (v <= 4) { // Check for IE>9 using user agent
            var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:|Edge\/)(\d+)/);
            v = match ? parseInt(match[1]) : undefined;
        }
        return v;
    }());

Dies kann verwendet werden, um nützliche Klassen für Ihr Dokument festzulegen, das die IE-Version enthält:

    if (ie) {
        document.documentElement.className += ' ie' + ie;
        if (ie < 9)
            document.documentElement.className += ' ieLT9';
    }

Beachten Sie, dass der verwendete Kompatibilitätsmodus erkannt wird, wenn sich der IE im Kompatibilitätsmodus befindet. Beachten Sie auch, dass die IE-Version hauptsächlich für ältere Versionen nützlich ist (<10). Höhere Versionen sind standardkonformer und es ist wahrscheinlich besser, stattdessen mit modernizr.js nach Funktionen zu suchen.

jtbr
quelle
1

Ich habe dafür ein praktisches Unterstrich-Mixin gemacht.

_.isIE();        // Any version of IE?
_.isIE(9);       // IE 9?
_.isIE([7,8,9]); // IE 7, 8 or 9?

_.mixin({
  isIE: function(mixed) {
    if (_.isUndefined(mixed)) {
      mixed = [7, 8, 9, 10, 11];
    } else if (_.isNumber(mixed)) {
      mixed = [mixed];
    }
    for (var j = 0; j < mixed.length; j++) {
      var re;
      switch (mixed[j]) {
        case 11:
          re = /Trident.*rv\:11\./g;
          break;
        case 10:
          re = /MSIE\s10\./g;
          break;
        case 9:
          re = /MSIE\s9\./g;
          break;
        case 8:
          re = /MSIE\s8\./g;
          break;
        case 7:
          re = /MSIE\s7\./g;
          break;
      }

      if (!!window.navigator.userAgent.match(re)) {
        return true;
      }
    }

    return false;
  }
});

console.log(_.isIE());
console.log(_.isIE([7, 8, 9]));
console.log(_.isIE(11));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

danrichards
quelle
1

oder einfach

//   IE 10: ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'; 
//   IE 11: ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; 
// Edge 12: ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0'; 
// Edge 13: ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'; 

var isIE = navigator.userAgent.match(/MSIE|Trident|Edge/)
var IEVersion = ((navigator.userAgent.match(/(?:MSIE |Trident.*rv:|Edge\/)(\d+(\.\d+)?)/)) || []) [1]
Giacomo
quelle
0

Das umfassendste JS-Skript, das ich gefunden habe, um nach Versionen des IE zu suchen, ist http://www.pinlady.net/PluginDetect/IE/ . Die gesamte Bibliothek befindet sich unter http://www.pinlady.net/PluginDetect/Browsers/ .

Mit IE10 werden bedingte Anweisungen nicht mehr unterstützt.

Mit IE11 enthält der Benutzeragent kein MSIE mehr. Die Verwendung des Benutzeragenten ist auch nicht zuverlässig, da dies geändert werden kann.

Mit dem PluginDetect JS-Skript können Sie den IE erkennen und die genauen Versionen ermitteln, indem Sie sehr spezifischen und gut gestalteten Code verwenden, der auf bestimmte IE-Versionen abzielt. Dies ist sehr nützlich, wenn Sie genau wissen, mit welcher Browserversion Sie arbeiten.

Immer drücken
quelle
0

Mir ist klar, dass ich hier etwas zu spät zur Party komme, aber ich habe einen einfachen einzeiligen Weg ausprobiert, um Feedback zu geben, ob ein Browser IE ist und welche Version ab 10 es war. Ich habe dies nicht für Version 11 codiert, daher ist möglicherweise eine kleine Änderung erforderlich.

Dies ist jedoch der Code. Er funktioniert als Objekt mit einer Eigenschaft und einer Methode und basiert auf der Objekterkennung, anstatt das Navigatorobjekt zu kratzen (das massiv fehlerhaft ist, da es gefälscht werden kann).

var isIE = { browser:/*@cc_on!@*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };

Die Verwendung ist isIE.browsereine Eigenschaft, die einen Booleschen Wert zurückgibt und sich auf bedingte Kommentare stützt. Die Methode isIE.detectedVersion()gibt eine Zahl zwischen 5 und 10 zurück. Ich gehe davon aus, dass alles unter 6 liegt und Sie sich in einem ernsthaften Gebiet der alten Schule befinden und etwas bulligeres als Ein Einzeiler und alles, was höher als 10 ist, und Sie befinden sich in einem neueren Gebiet. Ich habe etwas über IE11 gelesen, das bedingte Kommentare nicht unterstützt, aber ich habe es nicht vollständig untersucht, vielleicht für einen späteren Zeitpunkt.

Wie auch immer, und für einen Einzeiler werden die Grundlagen des IE-Browsers und der Versionserkennung behandelt. Es ist alles andere als perfekt, aber es ist klein und leicht zu ändern.

Nur als Referenz, und wenn jemand Zweifel daran hat, wie dies tatsächlich implementiert werden soll, sollte die folgende Bedingung helfen.

var isIE = { browser:/*@cc_on!@*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };

/* testing IE */

if (isIE.browser) {
  alert("This is an IE browser, with a detected version of : " + isIE.detectedVersion());
}
Ric
quelle
0

Das Erkennen des IE und seiner Versionen könnte nicht einfacher sein, und alles, was Sie brauchen, ist ein bisschen natives / Vanille-Javascript:

var uA = navigator.userAgent;
var browser = null;
var ieVersion = null;

if (uA.indexOf('MSIE 6') >= 0) {
    browser = 'IE';
    ieVersion = 6;
}
if (uA.indexOf('MSIE 7') >= 0) {
    browser = 'IE';
    ieVersion = 7;
}
if (document.documentMode) { // as of IE8
    browser = 'IE';
    ieVersion = document.documentMode;
}

Und dies ist eine Möglichkeit, es zu verwenden:

if (browser == 'IE' && ieVersion <= 9) 
    document.documentElement.className += ' ie9-';

.

Funktioniert in allen IE-Versionen, einschließlich höherer Versionen in niedrigerer Kompatibilitätsansicht / -modus, und documentModeist IE-geschützt.

Frank Conijn
quelle
0

Wenn Sie die IE-Browserversion löschen müssen, können Sie dem folgenden Code folgen. Dieser Code funktioniert gut für die Versionen IE6 bis IE11

<!DOCTYPE html>
<html>
<body>

<p>Click on Try button to check IE Browser version.</p>

<button onclick="getInternetExplorerVersion()">Try it</button>

<p id="demo"></p>

<script>
function getInternetExplorerVersion() {
   var ua = window.navigator.userAgent;
        var msie = ua.indexOf("MSIE ");
        var rv = -1;

        if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))      // If Internet Explorer, return version number
        {               
            if (isNaN(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))))) {
                //For IE 11 >
                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);
                        alert(rv);
                    }
                }
                else {
                    alert('otherbrowser');
                }
            }
            else {
                //For < IE11
                alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
            }
            return false;
        }}
</script>

</body>
</html>
Nimesh
quelle
0

Fenster läuft IE10 wird automatisch auf IE11 + aktualisiert und standardisiert W3C

Heutzutage müssen wir IE8- nicht mehr unterstützen.

    <!DOCTYPE html>
    <!--[if lt IE 9]><html class="ie ie8"><![endif]-->
    <!--[if IE 9]><html class="ie ie9"><![endif]-->
    <!--[if (gt IE 9)|!(IE)]><!--><html><!--<![endif]-->
    <head>
        ...
        <!--[if lt IE 8]><meta http-equiv="Refresh" content="0;url=/error-browser.html"><![endif]--
        ...
    </head>
xicooc
quelle
0
var isIE9OrBelow = function()
{
   return /MSIE\s/.test(navigator.userAgent) && parseFloat(navigator.appVersion.split("MSIE")[1]) < 10;
}
xicooc
quelle
0
if (!document.addEventListener) {
    // ie8
} else if (!window.btoa) {
    // ie9
}
// others
Bruce
quelle