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?
Der beste Weg, um in JavaScript ohne Bibliothek nach IE kleiner als 9 zu suchen
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
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
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=false
die 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
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.
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 😉
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');
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