Jak wykryć IE 8 za pomocą jQuery?

102

Muszę wykryć nie tylko typ przeglądarki, ale także jej wersję za pomocą jQuery. Przede wszystkim muszę się dowiedzieć, czy jest to IE 8, czy nie.

Nie jestem pewien, czy robię to poprawnie.

Jeśli zrobię :

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

Nie jestem pewien, czy będzie działać w wersji 8.123.45.6, czy też będzie działać?

Edycja: Zwróć uwagę, że JQuery 2+ zrezygnowało ze wsparcia dla IE8 i starszych i dlatego nie można go już używać do wykrywania IE8. W przypadku korzystania z aktualnej wersji JQuery konieczne jest użycie rozwiązania innego niż JQuery.

salmane
źródło
11
odpowiedzi, które są sugerowane poniżej, sugerują użycie jQuery.browser. Jednak dokumentacja jQuery przestaje używać jQuery.browser. Zamiast tego sugerują użycie jQuery.support i wskazanie funkcji, która nie jest obsługiwana, aby oznaczyć przeglądarkę. Na przykład możesz użyć if (jQuery.support.opacity == false) {twój kod IE8 i IE7}
IberoMedia
To jquery.support.opacitywłaśnie zrobił to, co chciałem. Dzięki ...
nrod
Jeśli robisz coś poprawnie, nie powinieneś prawie nigdy potrzebować wykrywania wersji przeglądarki. Jest powód, dla którego ta funkcja została usunięta z jQuery, a powodem jest to, że wykrywanie wersji przeglądarki jest złą praktyką. Użycie zamiast tego wykrywania funkcji rozwiąże problem w prawie wszystkich przypadkach.
Spudley
2
Muszę wykryć IE8, ponieważ jest to jedyna przeglądarka, w której silnik javascript jest tak wolny, że wyświetla na tej stronie okno dialogowe z napisem „Czy chcesz zatrzymać wykonywanie skryptu”, a domyślnie jest to „tak”. Jeśli istnieje do tego mechanizm wykrywania funkcji, użyję go. W przeciwnym razie jest to, jeśli przeglądarka == IE8. Nie mogę zoptymalizować javascript, ponieważ powoduje to własny kod drzewa Kendo
PandaWood

Odpowiedzi:

79

Jest to udokumentowane w dokumentacji jQuery API . Sprawdź, czy Internet Explorer jest dostępny za pomocą, $.browser.msiea następnie sprawdź jego wersję za pomocą $.browser.version.

AKTUALIZACJA: $ .browser usunięto w jQuery 1.9

Metoda jQuery.browser () jest przestarzała od wersji jQuery 1.3 i została usunięta w wersji 1.9. W razie potrzeby jest dostępny jako część wtyczki jQuery Migrate. Zalecamy używanie wykrywania funkcji z biblioteką, taką jak Modernizr.

AndiDog
źródło
jeśli to zrobię: if (jQuery.browser.version> = 8.0) {dosomething} Nie jestem pewien, czy będzie działać z wersją 8.123.45.6, czy też będzie?
salmane
13
To jest ciąg, więc powinieneś to zrobić if(jQuery.browser.version.substring(0, 2) == "8.") { ... }. W ten sposób będzie działać ze wszystkimi wersjami IE8.
AndiDog
13
jQuery.browserzostał wycofany w wersji 1.3 i może w przyszłości zostać przeniesiony do wtyczki. Zobacz dokumentację jQuery.browser
bendytree
Na szczęście wciąż istnieje i nie ma wzmianki o wycofaniu, @bendytree
Alastair
47
jquery.browser został usunięty w wersji 1.9
Mandeep Jain
173

Myślę, że najlepszym sposobem byłoby to:

Z szablonu HTML5:

<!--[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]-->

w JS:

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

zwłaszcza, że $.browserzostał usunięty z jQuery 1.9+.

meo
źródło
11
Jest to bardzo sprytny sposób wykrywania wersji IE. Bardzo lubię!
Greg
ale nie działa, jeśli Twoja witryna jest dostarczana z nagłówkiem „Content-type: application / xhtml + xml”, to te warunkowe komentarze są ignorowane
philipp
1
Bardzo sprytne ... ale warto zauważyć, że musisz sprawdzić aktualne klasy dodane przez warunki warunkowe w HTML5BP. W tej chwili myślę, że klasa to lt-ie9AOTie8
byronyasgur
2
@meo Też mi się podoba ta implementacja. Ale czy istnieje powód, dla którego klasa jest przywiązana <html>zamiast <body>?
odpoczynek
@meo Ciekawe. Dzięki.
odpoczynek
89

Powinno to działać dla wszystkich mniejszych wersji IE8

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

-- aktualizacja

Należy pamiętać, że $ .browser zostało usunięte z jQuery 1.9

Mithun Sreedharan
źródło
56

Nie zapominaj, że możesz również użyć HTML do wykrywania IE8.

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

Mając to przed wszystkimi skryptami, po prostu sprawdzisz zmienną „ie” lub cokolwiek innego.

TheBuzzSaw
źródło
4
Ta składnia obsługuje również komparatory „mniejsze niż” („[jeśli lt IE 7]”) i „większe niż” („[jeśli gt IE 8]”).
spiffytech
1
<! - [if lte IE 8]> za dołączenie IE8
user227353
1
To najlepszy sposób, aby to zrobić, po prostu przekieruj na inną stronę, na której jest napisane „Dlaczego używasz IE8?” ULEPSZ TERAZ!
Leon Gaban,
2
Zgodnie z dzisiejszym standardem zapytałbym ich, dlaczego w ogóle używają IE.
TheBuzzSaw
Wygląda to teraz na najlepsze rozwiązanie, ponieważ JQuery 2.1.1 nie działa z IE8 i dlatego nie może być używane do wykrywania IE8!
Dave
27

document.documentMode jest niezdefiniowana, jeśli przeglądarka nie jest IE8,

zwraca 8 dla trybu standardowego i 7 dla „kompatybilnego z IE7”

Jeśli działa jako IE7, istnieje wiele funkcji CSS i DOM, które nie będą obsługiwane.

kennebec
źródło
9
Zwróć uwagę, że IE9 zwraca 9. Ta odpowiedź powinna być jednak wyższa, ponieważ teraz, gdy $ .browser nie jest już dobrym rozwiązaniem. Spróbuj:if ((document.documentMode || 100) < 9) { // IE8
Don McCurdy,
if (document.documentMode! == undefined && document.documentMode == 8) {...}
jpprade
W przypadku niektórych aplikacji, w których IE8 jest nadal bardzo w użyciu - a mianowicie w szkołach amerykańskich - podejście @ Don McCurdy jest zarówno proste, jak i skuteczne. W połączeniu z Modernizrem działa dobrze.
cbmtrx
Świetna odpowiedź! Spowoduje to zwrócenie numerów wersji od IE8 do IE11 (w porównaniu do IE5 do IE9 w przypadku komentarzy warunkowych - jeśli ktoś nadal musi wykrywać również autentyczne IE7 lub IE6, konieczne będzie użycie komentarzy warunkowych). Zauważ, że zgodnie z dokumentacją może on powrócić 0podczas ładowania strony - „spróbuj określić tryb zgodności dokumentu w późniejszym czasie” (tj. Po przygotowaniu dokumentu).
user56reinstatemonica8
15

Zarozumiały...

  • ... że jest to chropawy silnik renderujący starszych wersji IE, który chcesz wykryć, aby styl wyglądał dobrze w starym IE (w przeciwnym razie użyj wykrywania funkcji)
  • ... że nie możesz po prostu dodawać warunkowych komentarzy do HTML - np. dla wtyczek JS, które można zastosować na dowolnej stronie (w przeciwnym razie po prostu zrób sztuczkę z klasami warunkowymi na <body>lub <html>)

... to jest prawdopodobnie najlepsza sztuczka (oparta na tym innym wariancie niż jQuery, nieco mniej elastycznym ). Tworzy następnie testy, a następnie usuwa odpowiedni komentarz warunkowy.

(Komentarze warunkowe są ignorowane w `` trybie standardów '' IE10 + - ale powinno to wystarczyć, ponieważ IE10 + `` tryb standardów '' nie ma szalonego silnika renderującego!)

Upuść tę funkcję:

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;
}

Następnie użyj tego w ten sposób:

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... */ }

Sugerowałbym również buforowanie wyników tej funkcji, abyś nie musiał jej powtarzać. Na przykład, możesz użyć łańcucha (comparison||'')+' IE '+(version||'')jako klucza do przechowywania i sprawdzania wyniku tego testu w jakimś obiekcie.

user56reinstatemonica8
źródło
9

Uwaga:

1) Wydaje się, że $ .browser został usunięty w jQuery 1.9+ (jak zauważył Mandeep Jain). Jest zalecane , aby użyć Wspomóż zamiast.

2) $ .browser.version może zwrócić „7” w IE> 7, gdy przeglądarka jest w trybie „zgodności”.

3) Od wersji IE 10 komentarze warunkowe nie będą już działać.

4) jQuery 2.0+ porzuci wsparcie dla IE 6/7/8

5) document.documentMode wydaje się być zdefiniowana tylko w przeglądarkach Internet Explorer 8+. Zwrócona wartość informuje, w jakim trybie „zgodności” działa Internet Explorer. Jednak nadal nie jest to dobre rozwiązanie.

Wypróbowałem wiele opcji .support (), ale wydaje się, że gdy przeglądarka IE (9+) jest w trybie zgodności, po prostu zachowuje się jak IE 7 ... :(

Do tej pory tylko to działało (kind-a):

(jeśli documentMode nie jest zdefiniowana, a htmlSerialize i opacity nie są obsługiwane, najprawdopodobniej patrzysz na IE <8 ...)

if(!document.documentMode && !$.support.htmlSerialize && !$.support.opacity) 
{
    // IE 6/7 code
}
Hanzaplastique
źródło
5

Jeśli bawisz się wersjami przeglądarek, często nie prowadzi to do niczego dobrego. Nie chcesz tego wdrażać samodzielnie. Ale możesz Modernizr wykonany przez Paula Irisha i innych mądrych ludzi. Wykryje, co przeglądarka faktycznie może zrobić i umieści odpowiednie klasy w <html>elemencie. Jednak z Modernizrem możesz przetestować wersję IE w następujący sposób:

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

Podobnie możesz użyć .lt-ie8i .lt-ie7.

koubic
źródło
3

Powinieneś także spojrzeć na jQuery.support . Wykrywanie funkcji jest o wiele bardziej niezawodne niż wykrywanie przeglądarki do kodowania funkcji (chyba że próbujesz tylko rejestrować wersje przeglądarki).

jkyle
źródło
3
jak można użyć jQuery.support do wykrywania IE8?
BishopZ
jeśli AJAX jest tym, czego szukasz, możesz użyć jQuery.support.ajax, który zwraca true, jeśli przeglądarka obsługuje AJAX
Jonathan Lin
Ta odpowiedź powinna pomóc: stackoverflow.com/questions/1944169/…
helgatheviking
3

Możesz łatwo wykryć typ i wersję przeglądarki za pomocą tego jquery

$(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
źródło
1

Oto wtyczka do wykrywania przeglądarki Jquery, która identyfikuje wykrywanie przeglądarki / systemu operacyjnego.

Możesz użyć tego do stylizacji po dołączeniu wtyczki.

$("html").addClass($.os.name);
$("body").addClass($.browser.className);
$("body").addClass($.browser.name);
Aravind Vel
źródło
0

Możesz użyć $ .browser do wykrycia nazwy przeglądarki. możliwe wartości to:

  • webkit (od jQuery 1.4)
  • safari (przestarzałe)
  • opera
  • msie
  • mozilla

lub uzyskaj flagę logiczną: $ .browser.msie będzie prawdziwe, jeśli przeglądarka to MSIE.

jeśli chodzi o numer wersji, jeśli interesuje Cię tylko główny numer wydania - możesz użyć parseInt ($. browser.version, 10). nie ma potrzeby samodzielnego analizowania ciągu $ .browser.version.

W każdym razie właściwość $ .support jest dostępna do wykrywania wsparcia dla określonych funkcji, zamiast polegać na $ .browser.

Yonatan Betzer
źródło