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

Lesezeit: 6 Minuten

Was wäre Ihr schnellster, kürzester (bester) Weg, um Browser zu erkennen, die IE und Version kleiner als 9 in JavaScript sind, ohne jQuery oder Add-On-Bibliotheken zu verwenden?

  • Ich bin mir der Bedingungen im DOM voll bewusst. Nur an einer kleinen JavaScript-Lösung mit der besten Leistung interessiert.

    – bcm

    7. April 2011 um 1:26 Uhr

  • Vergiss das nicht Merkmalserkennung ist am zuverlässigsten, wenn Sie eine versionsspezifische Funktion verwenden möchten (die Funktion kann jedoch in einigen Versionen vorhanden sein, aber fehlerhaft sein, denken Sie daran). Wenn Sie die Browserversion auf der Seite anzeigen möchten, verwenden Sie Browsererkennung.

    – Dan

    7. Oktober 2011 um 16:23 Uhr

  • Ich stimme Dan zu, aber in Wahrheit ist es oft nicht einfach und/oder für jeden einfach, einen bestimmten Unterschied mit einem Merkmal (Erkennung) zu verknüpfen. Selbst wenn dies der Fall ist, kann der Code einfacher zu lesen sein, wenn er der bereitgestellten Antwort entspricht (Beispiel: dh < 9).

    – bcm

    8. Mai 2014 um 3:33 Uhr


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

  • 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

    7. April 2011 um 2:35 Uhr

  • Es befindet sich nur im Speicher, das von ihm erstellte Div wird nicht wirklich zum DOM hinzugefügt.

    – Mike Lewis

    7. April 2011 um 2:40 Uhr

  • Hmm, ist das regelmäßig while Syntax? Oder eine Art Hack?

    – Tim Büthe

    26. August 2013 um 9:31 Uhr

  • @TimBüthe: Die Komma-Operator. Im Wesentlichen fügt es das innere HTML hinzu und kehrt zurück all[0] (das ist das erste <i> im Div). Solange das Ergebnis “Wahrheit” ist (an <i> gefunden wurde), geht es eine IE-Version hoch und geht weiter.

    – Brad Christie

    25. Oktober 2013 um 14:54 Uhr


  • Es ist erwähnenswert, IE unterstützt keine bedingten Kommentare mehr IE10+

    – Davisstar

    12. Februar 2016 um 18:57 Uhr


Benutzer-Avatar
Vektor

was es wert ist:

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

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

  • Das ist meiner Meinung nach die beste Antwort. Die Browsererkennung sollte angegangen werden, indem bestimmte Funktionen erkannt werden.

    – 7dr3am7

    8. November 2013 um 11:23 Uhr

  • Ich mag diese Antwort. Es handelt sich nicht um die Erkennung der Browserversion, sondern um die Erkennung der Browserfähigkeit – was normalerweise nützlicher ist. Das Erkennen einer Funktion wie „addEventListener“ wird nicht nur IE8 von IE9 trennen, sondern auch alte Browser von HTML5-fähigen Browsern im Allgemeinen trennen.

    – garv

    20. Februar 2014 um 17:38 Uhr


  • var ltIE9 = !document.addEventListener;

    – Joe Rennen

    11. September 2014 um 9:51 Uhr


  • Leider schlägt dies fehl, wenn Sie Polyfill haben document.addEventListener. Bedingte IE-Kommentare sind in dieser Hinsicht ausfallsicher.

    – Daniel Weiner

    28. Januar 2015 um 17:20 Uhr

  • Um zu verhindern, dass die Methode durch Polifills fehlschlägt. Einfach umdrehen und prüfen: if( !document.attachEvent){ // IE8+ }

    – Jesper Jensen

    2. Juli 2015 um 6:12 Uhr


Benutzer-Avatar
Jahel

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

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

Natürlich könnten Sie diesem Block einen universellen Block voranstellen, der deklariert var is_ie_lt9=falsedie dies für IE kleiner als 9 überschreiben würde. (In diesem Fall möchten Sie die var Erklärung, da sie sich wiederholen würde).

BEARBEITEN: Hier ist eine Version, die nicht auf Inline-Skriptblöcke angewiesen ist (kann von einer externen Datei ausgeführt werden), aber kein User-Agent-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}

  • Erstellen einer globalen Variablen mit bedingten Tags … interessant.

    – bcm

    7. April 2011 um 1:29 Uhr

  • Es hat den Vorteil, dass es keine RegEx beinhaltet und vermutlich nicht fälschbar ist. IE analysiert die Variable, als wäre sie nichts. (Was für IE etwas aussagt.)

    – Jahel

    7. April 2011 um 1:30 Uhr

  • das ist ziemlich gut, ich könnte if(window.ielt9) verwenden. Ich frage mich, ob es eine bessere Nicht-Inline-Skriptlösung geben könnte? (was schick wäre…)

    – bcm

    7. April 2011 um 1:39 Uhr

  • Es scheint, als würde die Lösung von @cwolves es Ihnen ermöglichen, sie in einem externen Skript auszuführen (ich habe es nie versucht).

    – Jahel

    7. April 2011 um 1:41 Uhr

Benutzer-Avatar
Keiner

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

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

Im Ernst, werfen Sie das einfach raus, falls es Ihnen besser passt … sie sind dasselbe, dies kann nur in einer .js-Datei statt in Inline-HTML sein

Hinweis: Es ist reiner Zufall, dass der jscript_version-Check hier “9” ist. Wenn Sie es auf 8, 7 usw. setzen, wird “ist IE8” NICHT überprüft. Sie müssen die JScript-Versionen für diese Browser nachschlagen.

Benutzer-Avatar
Hinrichtung

Unten ist eine Verbesserung gegenüber der Lösung von James Padolsey:

1) Es verschmutzt den Speicher nicht (James’ Snippet erstellt beispielsweise 7 nicht entfernte Dokumentfragmente, wenn IE11 erkannt wird).
2) Es ist schneller, da es vor dem Generieren von Markup nach einem documentMode-Wert sucht.
3) Es ist viel besser lesbar, besonders für JavaScript-Programmieranfänger.

Gist-Link: 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;
})();

var ie = !-[1,]; // true if IE less than 9

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

Wie es funktioniert: dh Engine behandelt Array mit leerem Element (wie diese [,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 erhalten NaN in ie und 1 in anderen. Dann wandeln wir es in einen booleschen Wert um und kehren den Wert mit ! um. Einfach. Übrigens können wir die kürzere Version ohne verwenden! Vorzeichen, aber der Wert wird umgekehrt.

Das ist jetzt der kürzeste Hack. Und ich bin der Autor 😉

Benutzer-Avatar
Dan Beale

Ich habe mich stattdessen für die Objekterkennung entschieden.

Nachdem ich das gelesen habe:
http://www.quirksmode.org/js/support.html
und das:
http://diveintohtml5.ep.io/detect.html#canvas

Ich würde so etwas verwenden

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

1110660cookie-checkDer beste Weg, um in JavaScript ohne Bibliothek nach IE kleiner als 9 zu suchen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy