Wie erkenne ich IE 8 mit jQuery?

102

Ich muss nicht nur den Browsertyp, sondern auch die Version mit jQuery erkennen. Meistens muss ich herausfinden, ob es IE 8 ist oder nicht.

Ich bin mir nicht sicher, ob ich es richtig mache.

Wenn ich mache :

if (jQuery.browser.version >= 8.0) {
dosomething}

Ich bin nicht sicher, ob es für Version 8.123.45.6 funktioniert, oder?

Bearbeiten: Beachten Sie, dass JQuery 2+ die Unterstützung für IE8 und niedriger eingestellt hat und daher nicht mehr zur Erkennung von IE8 verwendet werden kann. Wenn Sie eine aktuelle Version von JQuery verwenden, muss eine Nicht-JQuery-Lösung verwendet werden.

Salmane
quelle
11
Die unten vorgeschlagenen Antworten deuten darauf hin, dass Sie jQuery.browser verwenden. In der jQuery-Dokumentation wird die Verwendung von jQuery.browser jedoch abgelehnt. Stattdessen schlagen sie vor, dass Sie jQuery.support verwenden und auf eine Funktion verweisen, die nicht unterstützt wird, um den Browser zu kennzeichnen. Zum Beispiel können Sie if (jQuery.support.opacity == false) {Ihren IE8- und IE7-Code}
IberoMedia
Das hat jquery.support.opacityeinfach getan, was ich wollte. Danke ...
nrod
Wenn Sie die Dinge richtig machen, sollten Sie kaum jemals eine Browserversionserkennung durchführen müssen. Es gibt einen Grund, warum diese Funktion aus jQuery entfernt wurde, und dieser Grund ist, dass die Erkennung der Browserversion eine schlechte Praxis ist. Die Verwendung der Feature-Erkennung löst das Problem in fast allen Fällen.
Spudley
2
Ich muss IE8 erkennen, da es der einzige Browser ist, dessen Javascript-Engine so langsam ist, dass auf dieser Seite ein Dialogfeld mit der Meldung "Möchten Sie die Ausführung von Skripten beenden" angezeigt wird und der Standardwert "Ja" lautet. Wenn es dafür einen Mechanismus zur Erkennung von Merkmalen gibt, werde ich ihn verwenden. Ansonsten ist es wenn Browser == IE8. Ich kann das Javascript nicht optimieren, weil es
Kendos

Antworten:

79

Es ist in der jQuery API-Dokumentation dokumentiert . Suchen Sie nach Internet Explorer mit $.browser.msieund überprüfen Sie dann die Version mit $.browser.version.

UPDATE: $ .browser in jQuery 1.9 entfernt

Die Methode jQuery.browser () ist seit jQuery 1.3 veraltet und wird in 1.9 entfernt. Bei Bedarf ist es als Teil des jQuery Migrate-Plugins verfügbar. Wir empfehlen die Feature-Erkennung mit einer Bibliothek wie Modernizr.

AndiDog
quelle
Wenn ja: if (jQuery.browser.version> = 8.0) {dosomething} Ich bin nicht sicher, ob es für Version 8.123.45.6 funktioniert, oder?
Salmane
13
Es ist eine Zeichenfolge, also sollten Sie es tun if(jQuery.browser.version.substring(0, 2) == "8.") { ... }. Auf diese Weise funktioniert es mit allen Versionen von IE8.
AndiDog
13
jQuery.browserwurde in 1.3 veraltet und kann in Zukunft auf ein Plugin verschoben werden. Siehe die jQuery.browser-Dokumente
Bendytree
Zum Glück ist es immer noch da und es gibt keine Erwähnung von Abwertung, @bendytree
Alastair
47
jquery.browser wird in 1.9
Mandeep Jain
173

Ich denke, der beste Weg wäre folgender:

Aus HTML5 Boilerplate:

<!--[if lt IE 7]> <html lang="en-us" class="no-js ie6 oldie"> <![endif]-->
<!--[if IE 7]>    <html lang="en-us" class="no-js ie7 oldie"> <![endif]-->
<!--[if IE 8]>    <html lang="en-us" class="no-js ie8 oldie"> <![endif]-->
<!--[if gt IE 8]><!--> <html lang="en-us" class="no-js"> <!--<![endif]-->

in JS:

if( $("html").hasClass("ie8") ) { /* do your things */ };

zumal seitdem $.browseraus jQuery 1.9+ entfernt wurde.

meo
quelle
11
Dies ist eine sehr clevere Methode zum Erkennen von IE-Versionen. Ich mag sehr!
Greg
funktioniert aber nicht, wenn Ihre Website mit dem Header 'Content-type: application / xhtml + xml' geliefert wird, dann werden diese bedingten Kommentare ignoriert
philipp
1
Sehr clever ... aber erwähnenswert, dass Sie die aktuellen Klassen überprüfen müssen, die durch die Bedingungen in HTML5BP hinzugefügt wurden. Im Moment denke ich, dass die Klasse lt-ie9AOT istie8
byronyasgur
2
@meo Ich mag diese Implementierung auch. Aber gibt es einen Grund, warum die Klasse an <html>anstatt gebunden ist <body>?
Ruhe
@meo Interessant. Vielen Dank.
Ruhe
89

Dies sollte für alle IE8-Nebenversionen funktionieren

if ($.browser.msie  && parseInt($.browser.version, 10) === 8) {
  alert('IE8'); 
} else {
  alert('Non IE8');
}

- aktualisieren

Bitte beachten Sie, dass $ .Browser wird von jQuery 1.9 entfernt

Mithun Sreedharan
quelle
56

Vergessen Sie nicht, dass Sie auch HTML verwenden können, um IE8 zu erkennen.

<!--[if IE 8]>
<script type="text/javascript">
    ie = 8;
</script>
<![endif]-->

Wenn Sie dies vor all Ihren Skripten haben, können Sie einfach die Variable "ie" oder was auch immer überprüfen.

TheBuzzSaw
quelle
4
Diese Syntax unterstützt auch Komparatoren "kleiner als" ("[wenn IE 7]") und "größer als" ("[wenn IE 7]").
Spiffytech
1
<! - [if lte IE 8]> für die Aufnahme von ie8
user227353
1
Dies ist der beste Weg, um dies zu tun. Leiten Sie einfach zu einer anderen Seite weiter, auf der steht: "Warum verwenden Sie IE8?" JETZT UPGRADEN!
Leon Gaban
2
Nach heutigem Standard würde ich sie fragen, warum sie überhaupt IE verwenden.
TheBuzzSaw
Dies scheint jetzt die beste Lösung zu sein, da JQuery 2.1.1 nicht mit IE8 funktioniert und daher nicht zur Erkennung von IE8 verwendet werden kann!
Dave
27

document.documentMode ist undefiniert, wenn der Browser nicht IE8 ist.

Es gibt 8 für den Standardmodus und 7 für "Kompatibel mit IE7" zurück.

Wenn es als IE7 ausgeführt wird, gibt es viele CSS- und Dom-Funktionen, die nicht unterstützt werden.

kennebec
quelle
9
Beachten Sie, dass IE9 9 zurückgibt. Dies sollte jedoch eine höher bewertete Antwort sein, da $ .browser keine gute Lösung mehr ist. Versuchen Sie:if ((document.documentMode || 100) < 9) { // IE8
Don McCurdy
if (document.documentMode! == undefined && document.documentMode == 8) {...}
jpprade
Für einige Anwendungen, in denen IE8 noch sehr häufig verwendet wird, nämlich US-Schulen, ist der Ansatz von @ Don McCurdy sowohl einfach als auch effektiv. In Verbindung mit Modernizr funktioniert es einwandfrei.
cbmtrx
Gute Antwort! Dies gibt Versionsnummern für IE8 bis IE11 zurück (im Vergleich zu IE5 bis IE9 für bedingte Kommentare - wenn noch jemand echte IE7 oder IE6 erkennen muss, müssen Sie bedingte Kommentare verwenden). Beachten Sie, dass es laut den Dokumenten möglicherweise zurückgegeben wird, 0während die Seite geladen wird - "versuchen Sie, den Dokumentkompatibilitätsmodus zu einem späteren Zeitpunkt zu bestimmen" (dh nachdem das Dokument fertig ist).
user56reinstatemonica8
15

Vorausgesetzt ...

  • ... dass es sich um die knifflige Rendering-Engine alter IE-Versionen handelt, die Sie erkennen möchten, damit ein Stil im alten IE richtig aussieht (andernfalls verwenden Sie die Feature-Erkennung).
  • ... dass Sie dem HTML nicht nur bedingte Kommentare hinzufügen können - z. B. für JS-Plugins, die auf jede Seite angewendet werden können (andernfalls führen Sie einfach den Trick der bedingten Klassen auf <body>oder aus <html>).

... dann ist dies wahrscheinlich der beste Trick (basierend auf dieser nicht jQuery, etwas weniger flexiblen Variante ). Es werden dann Tests erstellt und anschließend ein entsprechender bedingter Kommentar entfernt.

(Bedingte Kommentare werden im IE10 + 'Standardmodus' ignoriert - aber das sollte in Ordnung sein, da IE10 + 'Standardmodus' keine verrückte Rendering-Engine hat!)

Lassen Sie diese Funktion fallen:

function isIE( version, comparison ){
    var $div = $('<div style="display:none;"/>');

    // Don't chain these, in IE8 chaining stops some versions of jQuery writing the conditional comment properly
    $div.appendTo($('body'));
    $div.html('<!--[if '+(comparison||'')+' IE '+(version||'')+']><a>&nbsp;</a><![endif]-->');

    var ieTest = $div.find('a').length;
    $div.remove();
    return ieTest;
}

Dann benutze es so:

if(isIE()){ /* runs in all versions of IE after 4 before standards-mode 10 */ }

if(isIE(8)){ /* runs in IE8 */ }

if(isIE(9)){ /* runs in IE9 */ }

if(isIE(8,'lte')){ /* runs in IE8 or below */ }

if(isIE(6,'lte')){ /* if you need this, I pity you... */ }

Ich würde auch vorschlagen, die Ergebnisse dieser Funktion zwischenzuspeichern, damit Sie sie nicht wiederholen müssen. Sie können die Zeichenfolge (comparison||'')+' IE '+(version||'')beispielsweise als Schlüssel verwenden, um das Ergebnis dieses Tests in einem Objekt irgendwo zu speichern und zu überprüfen.

user56reinstatemonica8
quelle
9

Hinweis:

1) $ .browser scheint in jQuery 1.9+ gelöscht zu sein (wie von Mandeep Jain angegeben). Es wird empfohlen , stattdessen .support zu verwenden.

2) $ .browser.version kann im IE> 7 "7" zurückgeben, wenn sich der Browser im "Kompatibilitäts" -Modus befindet.

3) Ab IE 10 funktionieren bedingte Kommentare nicht mehr.

4) jQuery 2.0+ wird die Unterstützung für IE 6/7/8 einstellen

5) document.documentMode scheint nur in Internet Explorer 8+ Browsern definiert zu sein. Der zurückgegebene Wert gibt an, in welchem ​​Kompatibilitätsmodus Internet Explorer ausgeführt wird. Trotzdem keine gute Lösung.

Ich habe zahlreiche .support () -Optionen ausprobiert, aber es scheint, dass sich ein IE-Browser (9+) im Kompatibilitätsmodus einfach wie IE 7 verhält ... :(

Bisher habe ich nur festgestellt, dass dies funktioniert (Art-a):

(Wenn documentMode nicht definiert ist und htmlSerialize und Opacity nicht unterstützt werden, sehen Sie sich sehr wahrscheinlich IE <8 an ...)

if(!document.documentMode && !$.support.htmlSerialize && !$.support.opacity) 
{
    // IE 6/7 code
}
Hanzaplastique
quelle
5

Wenn Sie mit Browserversionen herumspielen, führt dies sehr oft zu nichts Gutem. Sie möchten es nicht selbst implementieren. Aber Sie können Modernizr von Paul Irish und anderen klugen Leuten gemacht. Es erkennt , was der Browser tatsächlich kann , und fügt dem <html>Element entsprechende Klassen hinzu . Mit Modernizr können Sie jedoch die IE-Version wie folgt testen:

$('html.lt-ie9').each() {
    // this will execute if browser is IE 8 or less
}

Ähnlich können Sie verwenden .lt-ie8, und .lt-ie7.

koubic
quelle
3

Sie sollten sich auch jQuery.support ansehen . Die Funktionserkennung ist für die Codierung Ihrer Funktionen viel zuverlässiger als die Browsererkennung (es sei denn, Sie versuchen nur, Browserversionen zu protokollieren).

jkyle
quelle
3
Wie würden Sie jQuery.support verwenden, um IE8 zu erkennen?
BishopZ
Wenn AJAX das ist, wonach Sie suchen, können Sie jQuery.support.ajax verwenden, das true zurückgibt, wenn der Browser AJAX unterstützt
Jonathan Lin
Diese Antwort sollte helfen: stackoverflow.com/questions/1944169/…
helgatheviking
3

Mit dieser Abfrage können Sie leicht erkennen, welcher Typ und welche Version des Browsers

$(document).ready(function()
{
 if ( $.browser.msie ){
    if($.browser.version == '6.0')
    {   $('html').addClass('ie6');
    }
    else if($.browser.version == '7.0')
    {   $('html').addClass('ie7');
    }
    else if($.browser.version == '8.0')
    {   $('html').addClass('ie8');
    }
    else if($.browser.version == '9.0')
    {   $('html').addClass('ie9');
    }
 }
 else if ( $.browser.webkit )
 { $('html').addClass('webkit');
 }
 else if ( $.browser.mozilla )
 { $('html').addClass('mozilla');
 }
 else if ( $.browser.opera )
 { $('html').addClass('opera');
 }
});
Sanooj
quelle
1

Hier ist das Jquery-Browser-Erkennungs-Plugin zur Identifizierung der Browser- / Betriebssystemerkennung.

Sie können dies für Stylingzwecke verwenden, nachdem Sie das Plugin hinzugefügt haben.

$("html").addClass($.os.name);
$("body").addClass($.browser.className);
$("body").addClass($.browser.name);
Aravind Vel
quelle
0

Sie können $ .browser verwenden, um den Browsernamen zu ermitteln. Mögliche Werte sind:

  • Webkit (ab jQuery 1.4)
  • Safari (veraltet)
  • Oper
  • msie
  • Mozilla

oder erhalten Sie ein boolesches Flag: $ .browser.msie ist wahr, wenn der Browser MSIE ist.

Was die Versionsnummer betrifft, können Sie parseInt ($. browser.version, 10) verwenden, wenn Sie nur an der Hauptversionsnummer interessiert sind. Sie müssen die Zeichenfolge $ .browser.version nicht selbst analysieren.

Auf jeden Fall ist die Eigenschaft $ .support verfügbar, um die Unterstützung für bestimmte Funktionen zu erkennen, anstatt sich auf $ .browser zu verlassen.

Yonatan Betzer
quelle