webentwicklung-frage-antwort-db.com.de

Der beste Weg, um in JavaScript ohne Bibliothek auf IE weniger als 9 zu prüfen

Was wäre Ihre schnellste, kürzeste (beste) Methode, um einen Browser zu erkennen, der in JavaScript IE und einer Version kleiner als 9 ist, ohne jQuery oder Zusatzbibliotheken zu verwenden?

77
bcm

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 Folgendes tun:

ie < 9

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

118
Mike Lewis

für was es wert ist:

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

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

99
vector

Mit bedingten Kommentaren können Sie einen Skriptblock erstellen, der nur in IE weniger als 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 var is_ie_lt9=false Deklariert. Dies würde IE <9 überschreiben. (In diesem Fall möchten Sie Entfernen Sie die var -Deklaration, da sie sich wiederholen würde.

[~ # ~] edit [~ # ~] : Hier ist eine Version, die nicht auf Inline-Skriptblöcken basiert (kann von einem aus ausgeführt werden) externe Datei), verwendet jedoch kein User-Agent-Sniffing:

Über @ Cowboy :

with(document.createElement("b")){id=4;while(innerHTML="<!--[if gt IE "+ ++id+"]>1<![endif]-->",innerHTML>0);var ie=id>5?+id:0}
27
Yahel

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 dir besser passt ... sie sind das Gleiche, das kann nur in einer .js-Datei sein, anstatt in Inline-HTML

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

10
Mark Kahn

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

1) Der Speicher wird nicht verschmutzt (James 'Snippet erstellt beispielsweise beim Erkennen von IE11 7 nicht entfernte Dokumentfragmente).
2) Es ist schneller, da nach einem documentMode-Wert gesucht wird, bevor Markups generiert werden.
3) Es ist weitaus 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;
})();
9
execution
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.

Wie es funktioniert: ie 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 umwandeln, machen wir so etwas: (', 1' in ie/'1' in anderen) * 1 und wir bekommen NaN in ie und 1 in anderen. Dann transformieren wir es in einen Booleschen Wert und kehren ihn mit! Um. Einfach. Übrigens können wir ohne kürzere Version verwenden! Vorzeichen, aber Wert wird umgekehrt.

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

8
Aleko

Ich habe mich stattdessen für die Objekterkennung entschieden.

Nach dem Lesen: http://www.quirksmode.org/js/support.html und http://diveintohtml5.ep.io/detect.html#canvas =

Ich würde so etwas benutzen

if(!!document.createElement('canvas').getContext) alert('what is needed, supported');
6
bcm

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.');
}
5
Michael Benin

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

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

Mit einem regulären Ausdruck und .match() können Sie dies schnell und unkompliziert tun:

if (navigator.userAgent.match(/MSIE\s(?!9.0)/)) {
    // ie less than version 9
}
4
Alex

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 es, einen Browser aufzurufen, der nicht unterstützt wird, wenn er kleiner oder gleich IE8 ist.

Hier ist eine jslint-freie Version basierend auf Mike Lewis ':

/*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);
    }
}());
2
Doug

Muss es in JavaScript gemacht werden?

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]-->
2
LukeH
if (+(/MSIE\s(\d+)/.exec(navigator.userAgent)||0)[1] < 9) {
    // IE8 or less
}
  • extrahiere IE Version mit: /MSIE\s(\d+)/.exec(navigator.userAgent)
  • wenn es sich um einen Nicht-IE-Browser handelt, wird null zurückgegeben. In diesem Fall schaltet ||0null auf 0 um.
  • [1] Erhält die Hauptversion von IE oder undefined, wenn es sich nicht um einen IE Browser handelte
  • führender + konvertiert es in eine Zahl, undefined wird in NaN konvertiert
  • wenn Sie NaN mit einer Zahl vergleichen, wird immer false zurückgegeben.
1
Ivan

Sie alle versuchen, so einfache Dinge zu komplizieren. Verwenden Sie einfach einen einfachen bedingten JScript-Kommentar. Dies ist die schnellste Methode, da sie Nicht-IE-Browsern keinen Code für die Erkennung hinzufügt und die Kompatibilität auf Versionen von IE vor der Unterstützung von HTML-bedingten Kommentaren zurückgeht. Kurz gesagt,

var IE_version=(-1/*@cc_on,@[email protected]*/);

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

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

var IE_version=(-1/*@cc_on,@[email protected]*/);
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>");
}
0
user7892745