Der beste Weg, um in JavaScript ohne Bibliothek nach IE unter 9 zu suchen

76

Was wäre Ihre schnellste, kürzeste (beste) Möglichkeit, einen Browser mit IE und einer Version unter 9 in JavaScript zu erkennen, ohne jQuery oder Add-On-Bibliotheken zu verwenden?

bcm
quelle
Ich bin mir der Bedingungen im DOM voll bewusst. Nur interessiert an einer kleinen JavaScript-Lösung mit der besten Leistung.
bcm
5
Vergessen Sie nicht, dass die Funktionserkennung die zuverlässigste Funktion ist, wenn Sie eine versionenspezifische Funktion verwenden möchten (die Funktion kann jedoch vorhanden sein, in einigen Versionen jedoch fehlerhaft sein. Beachten Sie dies). Wenn Sie die Browserversion auf der Seite anzeigen möchten, verwenden Sie die Browsererkennung .
Dan
3
Ich stimme Dan zu, aber in Wahrheit ist es oft nicht einfach und / oder einfach für jeden, einen bestimmten Unterschied mit einer Funktion zu verknüpfen (Erkennung). Selbst wenn dies der Fall ist, ist der Code möglicherweise leichter zu lesen, wenn er der angegebenen Antwort entspricht (Beispiel: dh <9).
bcm

Antworten:

117

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;

}());

Sie können dann tun:

ie < 9

Von James Panolsey von hier: http://james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments

Mike Lewis
quelle
2
Ich frage mich nur ... sind all diese (div, all) nur im Speicher oder wird tatsächlich mehrmals auf das DOM zugegriffen, um die Version zu erhalten?
bcm
Es ist nur im Speicher, das Div, das es erstellt, wird nicht wirklich zum DOM hinzugefügt.
Mike Lewis
5
Hmm, ist das reguläre whileSyntax? Oder eine Art Hack?
Tim Büthe
13
@ TimBüthe: Der Komma - Operator . Im Wesentlichen wird der innere HTML-Code hinzugefügt und zurückgegeben all[0](dies ist der erste <i>im div). Solange das Ergebnis "wahr" ist (ein <i>gefunden wurde), wird eine IE-Version aufgerufen und fortgesetzt.
Brad Christie
1
Es ist erwähnenswert, dass IE bedingte Kommentare nicht mehr unterstützt. IE10 +
Daviestar
99

für das, was es wert ist:

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

Dies zielt erfolgreich auf IE 9+ ab, da die addEventListenerMethode für alle wichtigen Browser außer IE sehr früh unterstützt wurde. (Chrome, Firefox, Opera und Safari) MDN-Referenz . Es wird derzeit in IE9 unterstützt und wir können davon ausgehen, dass es hier auch weiterhin unterstützt wird.

Vektor
quelle
3
Das ist meiner Meinung nach die beste Antwort. Die Browsererkennung sollte durch Erkennen bestimmter Funktionen erreicht werden. /
7dr3am7
4
Ich mag diese Antwort. Es handelt sich nicht um eine Erkennung der Browserversion, sondern um eine Erkennung der Browserfähigkeit - was normalerweise nützlicher ist. Durch das Erkennen einer Funktion wie 'addEventListener' wird nicht nur IE8 von IE9 getrennt, sondern auch alte Browser von HTML5-fähigen Browsern im Allgemeinen.
Garyv
8
var ltIE9 = !document.addEventListener;
Josephrace
6
Dies schlägt leider fehl, wenn Sie mehrfach ausgefüllt haben document.addEventListener. IE-bedingte Kommentare sind in dieser Hinsicht ausfallsicher.
Daniel Weiner
2
Um zu verhindern, dass die Methode durch Polifills versagt. Drehen Sie es einfach um und überprüfen Sie:if( !document.attachEvent){ // IE8+ }
Jesper Jensen
27

Mit bedingten Kommentaren können Sie einen Skriptblock erstellen, der nur in IE unter 9 ausgeführt wird.

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

Natürlich können Sie diesem Block einen universellen Block voranstellen, der deklariert var is_ie_lt9=false, was dies für IE unter 9 überschreiben würde. (In diesem Fall möchten Sie die varDeklaration entfernen , da sie sich wiederholen würde.)

BEARBEITEN : Hier ist eine Version, die nicht auf Inline- Skriptblöcken basiert (kann von einer externen Datei ausgeführt werden), aber kein Benutzeragenten-Sniffing verwendet:

Über @cowboy :

with(document.createElement("b")){id=4;while(innerHTML="<!--[if gt IE "+ ++id+"]>1<![endif]-->",innerHTML>0);var ie=id>5?+id:0}
Yahel
quelle
2
Erstellen einer globalen Variablen mit bedingten Tags ... interessant.
bcm
Es hat den Vorteil, dass kein RegEx involviert ist und vermutlich nicht fälschbar ist. IE analysiert die Variable wie nichts. (Was für IE etwas sagt.)
Yahel
das ist ziemlich gut, ich könnte if (window.ielt9) verwenden. Ich frage mich, ob es eine bessere Inline-Skriptlösung geben könnte. (was schick wäre ...)
bcm
Es scheint, als ob die Lösung von @ cwolves es Ihnen ermöglichen würde, es in einem externen Skript auszuführen (ich habe es noch nie versucht.)
Yahel
10

bah zu bedingten Kommentaren! Bedingter Code den ganzen Weg !!! (dummer IE)

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

Im Ernst, wirf das einfach raus, falls es besser zu dir passt ... sie sind das Gleiche. Dies kann nur in einer .js-Datei statt in Inline-HTML sein

Hinweis: Es ist völlig zufällig, dass die Prüfung jscript_version hier "9" ist. Wenn Sie den Wert auf 8, 7 usw. setzen, wird NICHT "ist IE8" aktiviert. Sie müssen die jscript-Versionen für diese Browser nachschlagen.

Mark Kahn
quelle
1
@bcm - Sie sollten IE_LT_9 == falsein IE9 und truein IE8 bekommen. Ich benutze gerade einen Mac und habe hier keinen PC, daher kann ich ihn nicht testen, aber ich habe ihn aus dem Code gezogen, den ich geschrieben habe und von dem ich weiß, dass er funktioniert. Wenn es aus irgendeinem Grund nicht funktioniert, alert(@_jscript_version)sehen Sie, was Sie erhalten, und passen Sie es von dort aus an.
Mark Kahn
2
Seufz, der Code funktioniert. IE9 führt IE7 nicht aus, wenn es sich im Kompatibilitätsmodus befindet. Es verwendet weiterhin die JS-Engine von IE9. jsfiddle.net/aNGXS Laut IETester: IE9 sagt "9", IE8 sagt "5.6"
Mark Kahn
1
Verwenden Sie in beiden Fällen eine eigenständige Version von IE8, und Sie erhalten in dieser Warnung KEINE '9'. Sie erhalten '5.8' oder ähnliches (nicht sicher, ob sie jemals die JScript-Engine aktualisiert haben, aber es ist NICHT 9)
Mark Kahn
1
OMFG, ich habe dies gerade auf FÜNF Maschinen über RDC getestet und es funktioniert auf JEDEM. IE8 sagt '5.8', IE9 sagt '9'. Sie machen etwas falsch oder gehen davon aus, dass Sie die IE9-Engine nicht verwenden, wenn Sie es sind. Wie gesagt, IE9 im "Kompatibilitätsmodus" oder mit einem anderen Benutzeragenten ist immer noch IE9. Führen Sie eine eigenständige Version von IE8, IE7 oder einer früheren Version aus, und der Code funktioniert.
Mark Kahn
3
Sie verwenden jedoch immer noch IE9! Dies erkennt -THAT-. Wenn Sie eine eigenständige Kopie von IE8 ausführen, wird dies angezeigt. Machen Sie mich nicht dafür verantwortlich, dass Microsoft-Entwicklungstools wertlos sind.
Mark Kahn
9

Nachfolgend finden Sie eine Verbesserung gegenüber der Lösung von James Padolsey:

1) Der Speicher wird nicht verschmutzt (James 'Snippet erstellt beispielsweise 7 nicht entfernte Dokumentfragmente, wenn IE11 erkannt wird).
2) Es ist schneller, da vor dem Generieren von Markups nach einem documentMode-Wert gesucht wird.
3) Es ist viel besser lesbar, insbesondere für Anfänger von JavaScript-Programmierern.

Hauptlink: 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;
})();
Ausführung
quelle
8
var ie = !-[1,]; // true if IE less than 9

Dieser Hack wird in ie5,6,7,8 unterstützt. Es ist in ie9 + festgelegt (entspricht also den Anforderungen dieser Frage). Dieser Hack funktioniert in allen IE-Kompatibilitätsmodi.

So funktioniert es : dh Engine behandelt Array mit leerem Element (wie dieses [, 1]) als Array mit zwei Elementen, stattdessen denken andere Browser, dass es nur ein Element gibt. Wenn wir dieses Array mit dem Operator + in eine Zahl konvertieren, machen wir so etwas: (', 1' in dh / '1' in anderen) * 1 und wir erhalten NaN in dh und 1 in anderen. Dann transformieren wir es mit! In einen booleschen und umgekehrten Wert. Einfach. Übrigens können wir kürzere Version ohne verwenden! Vorzeichen, aber der Wert wird umgekehrt.

Dies ist mittlerweile der kürzeste Hack. Und ich bin der Autor;)

Aleko
quelle
Können Sie erklären, wie / warum das funktioniert? Es sieht nach einem bösen Hack aus: Sie verlassen sich auf die Macken der JavaScript-Engine und dass bestimmte Versionen der JavaScript-Engine bestimmten IE-Versionen entsprechen. Funktioniert das immer noch in neueren IEs, die auf Kompatibilität in den Debug-Tools oder im Kompatibilitätsmodus eingestellt sind?
Rup
Dieser Hack wird in ie5,6,7,8 unterstützt. Es ist in ie9 + festgelegt (entspricht also den Anforderungen dieser Frage). So funktioniert es: dh Engine behandelt Array mit leerem Element (wie dieses [, 1]) als Array mit zwei Elementen, stattdessen denken andere Browser, dass es nur ein Element gibt. Wenn wir also dieses Array mit dem Operator + in eine Zahl konvertieren, machen wir ungefähr so: (', 1' in dh / '1' in anderen) * 1 und wir erhalten NaN in dh und 1 in anderen. Dann transformieren wir es mit! In einen booleschen und umgekehrten Wert. Einfach. Übrigens können wir kürzere Version ohne verwenden! Vorzeichen, aber der Wert wird umgekehrt.
Aleko
OK, aber wenn ich IE 9 in den IE 7-Kompatibilitätsmodus versetze, erkennt es IE 7? Vielen Dank für die Erklärung - das wäre besser in der Antwort zu bearbeiten, als als Kommentar hinterlassen.
Rup
5

Dieser Link enthält relevante Informationen zum Erkennen von Versionen von Internet Explorer:

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

Beispiel:

if (document.all && !document.addEventListener) {
    alert('IE8 or older.');
}
Michael Benin
quelle
Ihre Antwort gefällt mir am besten. Einfach, nicht viele Codezeilen und flexibel.
user2662680
4

Sie könnten es schnell und schmutzig mit einem regulären Ausdruck tun und .match():

if (navigator.userAgent.match(/MSIE\s(?!9.0)/)) {
    // ie less than version 9
}
Alex
quelle
8
Leider erkennt das nur andere IEs als IE 9. Zum Beispiel gilt dies auch für IE 10.
Tim Jansen
4

Wenn ich Sie wäre, würde ich die bedingte Kompilierung oder Feature-Erkennung verwenden.
Hier ist eine andere Alternative:

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

Ich mochte die Antwort von Mike Lewis, aber der Code hat jslint nicht bestanden und ich konnte die funky while-Schleife nicht verstehen. Mein Anwendungsfall ist das Einrichten einer nicht unterstützten Browsernachricht, wenn sie kleiner oder gleich IE8 ist.

Hier ist eine kostenlose jslint-Version, die auf Mike Lewis 'basiert:

/*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);
    }
}());
Doug
quelle
1
weil jquery 2.x dh <9 nicht unterstützt, so dass ein Teil des Codes zu Fehlern und Abstürzen und Angst und Untergang führen würde.
1

Muss dies in JavaScript erfolgen?

Wenn nicht, können Sie die IE-spezifische Syntax für bedingte Kommentare verwenden:

<!--[if lt IE 9]><h1>Using IE 8 or lower</h1><![endif]-->
LukeH
quelle
1
JavaScript-Lösung, nicht im DOM
bcm
1
if (+(/MSIE\s(\d+)/.exec(navigator.userAgent)||0)[1] < 9) {
    // IE8 or less
}
  • IE-Version extrahieren mit: /MSIE\s(\d+)/.exec(navigator.userAgent)
  • wenn es nicht-IE - Browser ist wird diese Rückkehr nullso in diesem Fall ||0schaltet das nullzu0
  • [1]wird Hauptversion von IE erhalten oder undefinedwenn es kein IE-Browser war
  • führend +wird es in eine Zahl umwandeln, undefinedwird in umgewandeltNaN
  • Der Vergleich NaNmit einer Zahl wird immer zurückkehrenfalse
Ivan
quelle
0

Sie alle versuchen, solche einfachen Dinge zu komplizieren. Verwenden Sie einfach einen einfachen bedingten JScript-Kommentar. Es ist das schnellste, da es Nicht-IE-Browsern für die Erkennung keinen Code hinzufügt und Kompatibilität aufweist, die auf Versionen des IE zurückgeht, bevor HTML-bedingte Kommentare unterstützt wurden. Zusamenfassend,

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

Vorsicht vor Minifahrern: Die meisten (wenn nicht alle) verwechseln den speziellen bedingten Kommentar mit einem regulären Kommentar und entfernen ihn

Grundsätzlich setzt der obige Code den Wert von IE_version auf die Version von IE, die Sie verwenden, oder -1, wenn Sie IE nicht verwenden. Eine Live-Demonstration:

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


quelle