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?
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?
Antworten:
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
while
Syntax? Oder eine Art Hack?
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.
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 addEventListener
Methode 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.
var ltIE9 = !document.addEventListener;
document.addEventListener
. IE-bedingte Kommentare sind in dieser Hinsicht ausfallsicher.
if( !document.attachEvent){ // IE8+ }
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 var
Deklaration 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}
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.
IE_LT_9 == false
in IE9 und true
in 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.
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;
})();
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;)
Ich habe mich stattdessen für die Objekterkennung entschieden.
Nach dem Lesen: http://www.quirksmode.org/js/support.html und dies: http://diveintohtml5.ep.io/detect.html#canvas
Ich würde so etwas benutzen
if(!!document.createElement('canvas').getContext) alert('what is needed, supported');
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.');
}
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
}
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]-->
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);
}
}());
if (+(/MSIE\s(\d+)/.exec(navigator.userAgent)||0)[1] < 9) {
// IE8 or less
}
/MSIE\s(\d+)/.exec(navigator.userAgent)
null
so in diesem Fall ||0
schaltet das null
zu0
[1]
wird Hauptversion von IE erhalten oder undefined
wenn es kein IE-Browser war+
wird es in eine Zahl umwandeln, undefined
wird in umgewandeltNaN
NaN
mit einer Zahl wird immer zurückkehrenfalse
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>");
}