JavaScript: czy mogę wykryć IE9, jeśli jest w trybie zgodności IE7 lub IE8?

87

Muszę wiedzieć, czy przeglądarka, która identyfikuje się poprzez ciąg agenta użytkownika jako IE7 lub IE8, to naprawdę te przeglądarki, czy też jest to IE9 w trybie zgodności 7 lub 8.

Z tego, co widzę w ciągu agenta użytkownika, IE9 w trybie zgodności IE7 zapewnia identyczny ciąg znaków z prawdziwym IE7. Czy istnieje dodatkowa właściwość / element / obiekt, który mogę przetestować, aby sprawdzić, czy to „naprawdę” IE9 w przebraniu?

Zakładam, że tryb dokumentu nie pomoże, ponieważ strona, na którą jest ładowany mój skrypt, może wymuszać dziwactwa lub wymuszać określone ustawienie.

Mam nadzieję, że IE9 będzie miał jakąś właściwość, która istnieje i jest testowalna niezależnie od tego, czy jest w trybie 7, 8 czy 9.


Edytowano w celu dodania…

OK, teraz rozumiem, do czego zmierzałem źle. Używałem menu rozwijanego „Tryb przeglądarki” i przełączałem go na IE8 i IE7 i sądziłem, że jest to odpowiednio „tryb zgodności IE8” i „tryb zgodności IE7”. To oczywiście nieprawda. Tryb przeglądarki narzędzi deweloperskich naprawdę przełącza go tak, aby był „podobny” do tych starych przeglądarek, więc tylko słuszne jest zgłaszanie oryginalnych ciągów agenta użytkownika.

Jeśli opuszczę tryb przeglądarki zgodny z IE9 lub IE9 i wypróbuję zamiast tego warianty menu rozwijanego trybu dokumentu, w rzeczywistości otrzymam „Trident / 5.0” we wszystkich 8 kombinacjach (dwa tryby przeglądarki i 4 tryby dokumentów). Muszę tylko omijać wybór trybu przeglądarki IE7 i IE8, ponieważ tak naprawdę są (symulowane) IE7 i IE8.

Nie ma więc możliwości, aby strona, użytkownik niebędący programistą, metatag lub lista zgodności firmy Microsoft mogła wprowadzić przeglądarkę IE9 w ten niezidentyfikowany stan.

Samo użycie if(navigator.userAgent.indexOf("Trident/5")>-1)wystarczy.

Nie martw się, nie dotyczy to stylów, formatowania, logiki ani zawartości strony. Używam wykrywania funkcji do tych rzeczy. Muszę tylko wykryć IE9 (niezależnie od tego, w jakim trybie się znajduje) i podjąć decyzję dotyczącą zawartości innej niż strona.

Dziękuję za skierowanie mnie do odpowiedzi za pomocą sugestii i linków.

Dee2000
źródło
1
Nigdy nie ufaj agentowi użytkownika ... może doskonale kłamać i nie ma sposobu, aby upewnić się, czy mówi prawdę, czy nie ... powinieneś zamiast tego przetestować pod kątem określonych funkcji lub funkcji
JCOC611
2
@ JCOC611 Tak i nie. To jest konkretne pytanie, jak dowiedzieć się, czy jest to IE9 pod względem zgodności, co jest rozsądnym pytaniem. Ogólnie rzecz biorąc, nie należy polegać na ciągach agenta użytkownika dla funkcjonalności strony, ponieważ można to łatwo sfałszować, prawda.
Dennis G
1
Nawet jeśli klient użytkownika jest dokładny, zdecydowanie lepiej jest użyć wykrywania funkcji, jeśli jest to w ogóle możliwe. Wtedy nie musisz przede wszystkim wiedzieć, czy IE jest w trybie zgodności.
Dave Ward
1
Chcę tylko dodać, że jest to bardzo przydatne, jeśli chcesz zapewnić szybki samouczek użytkownikom, którzy używają niewłaściwego trybu przeglądarki.
Joost,
1
@ JCOC611, który sfałszowałby swojego agenta użytkownika i oczekiwał, że wszystko będzie działać poprawnie - czy naprawdę powinniśmy się tym przejmować?
JohnnyFaldo,

Odpowiedzi:

67

W rzeczywistości ciąg agenta użytkownika jest inny dla IE9, gdy jest uruchamiany w trybie zgodności IE7, więc byłby to jeden z najlepszych sposobów rozróżnienia różnych wersji IE.

Przedstawiamy ciąg agenta użytkownika przeglądarki IE9 :

Podobnie jak w IE8, widok zgodności w IE9 będzie mapowany na tryb standardów IE7, a ciąg znaków UA w IE9, gdy w widoku zgodności będzie wyglądał następująco:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)

W widoku zgodności IE9 zgłasza się jako IE7 za pośrednictwem numeru wersji aplikacji (Mozilla / 4.0) i tokena wersji (MSIE 7.0). Odbywa się to w celu zapewnienia zgodności. Zwiększony token Trident, od „Trident / 4.0” do „Trident / 5.0”, umożliwia stronom internetowym rozróżnienie między IE9 działającym w widoku Compat a IE8 działającym w widoku Compat .

(podkreślenie dodane przeze mnie). Tak więc ciąg agenta użytkownika jest taki sam, jak zgłasza się jako „Mozilla / 4.0” i MSIE 7.0, ale IE9 zawsze będzie Trident / 5.0 - bez względu na to, czy zawiera MSIE 7.0, MSIE 8.0 czy MSIE 9.0.

Właściwie powinieneś sprawdzić tę świetną kompilację: ciągi identyfikatorów przeglądarki (User-Agent) lub jeszcze lepsze useragentstrings.com

Dennis G
źródło
1
Cześć moontear. Widziałem również, że "Trident / 5.0" powinien być obecny, gdy IE9 jest w trybie IE7, ale nie to widzę na moim (ostatecznym) IE9 na Win7 Pro x64. W trybie IE7 nie pokazuje żadnego trójzębu (tak wygląda prawdziwy IE7) i pokazuje trójząb 4 w trybie IE8 (znowu, jak wygląda prawdziwy IE8). Najpierw używam listy rozwijanej narzędzi programistycznych IE9, aby wybrać tryb przeglądarki, a następnie w pasku adresu ostrzega javascript: alert (navigator.userAgent)
Dee2000
1
„Trident / 5.0” jest obecny w ciągu agenta użytkownika w IE9 we wszystkich trybach.
EricLaw
Jak mówi EricLaw, Dee. Trident / 5.0 musi być obecny, gdy używasz trybu zgodności (może być inny w trybie przeglądarki?). Jak sprawdzić ciąg agenta użytkownika? Spróbuj sprawdzić przez whatsmyuseragent.com i zgłoś się ponownie.
Dennis G
Zobacz moją odpowiedź poniżej (musiałem użyć innego identyfikatora Dee2001 ze względu na regułę 8 godzin przepełnienia stosu dotyczącą dodawania odpowiedzi do własnej wiadomości). Tak, Eric i Moontear są poprawne, Trident / 5.0 jest obecny we wszystkich trybach IE9. Moim wielkim błędem była zmiana „trybu przeglądarki” na IE7 lub IE8 w narzędziach programistycznych, ale nie jest to „tryb”, który może wymusić strona / metatag / lista zgodności. Zamiast tego naprawdę symuluje same przeglądarki, więc naturalnie ciąg useragent jest naprawdę podobny do IE7 / 8.
Dee2000
1
To jest doskonałe! Dzięki wielkie. Nie stylizuję na podstawie zgłoszonej przeglądarki, ale ustawiam pasek ostrzegawczy u góry strony, nad którą pracuję, z informacją, że użytkownik musi zaktualizować (jeśli np. Tagi warunkowe mówią, że jest mniejszy lub równy ie7) - Nie chcę, aby w tym przypadku komunikat mówił o aktualizacji, ale raczej wyłącz tryb zgodności
Chelsea Urquhart
47

document.documentMode to najlepszy sposób na tryb dokumentu.

Yuhong Bao
źródło
17
Proszę nieco rozwinąć odpowiedź. Więcej kontekstu.
random_user_name
3
Dlaczego ludzie nie dodają tego, to jest dokładnie to, czego potrzeba
Jamie Hutber,
5
To jest rzeczywiście najlepszy sposób. Można go używać w następujący sposób: <script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>. Prawdziwy (!) IE7 i wszystkie inne niż IE zwracają „undefined”, tylko IE8 / 9 w Comp. mode return 7. Nie mogę przetestować IE10, ale powinno być to samo.
Frank Conijn
2
Właśnie wypróbowałem to w IE10 na boku z tagiem META krawędzi; normalnie zwraca „10”. Wymuś włączenie trybu zgodności dla wszystkich witryn i nadal zwraca „10”.
Whelkaholizm
Działa dla mnie w IE10 i IE11 Preview
Simon Keep
20

IE7 nie zawiera żadnych informacji o Trident

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0)

IE8 zawiera następujący ciąg: „Trident / 4.0”

User-Agent : Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0)

IE9 zawiera następujący ciąg: „Trident / 5.0”

IE9 w trybie zgodności:

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0; Trident/5.0)

IE9 w trybie normalnym:

User-Agent : Mozilla/5.0 (compatible; MSIE 9.0; Trident/5.0)
Greg
źródło
1
To świetnie, czy IE10 inkrementuje również Trident?
slotishtype
3
Internet Explorer 10 użytkowników Trident / 6.0 .... patrz blogs.msdn.com/b/ie/archive/2012/07/12/…
slotishtype
1
a IE11 używa Trident / 7.0
Dee2000
11

Mam nadzieję, że IE9 będzie miał jakąś właściwość, która istnieje i jest testowalna niezależnie od tego, czy jest w trybie 7, 8 czy 9.

Sprawdź np. Style.opacity , zostało wprowadzone w IE9 i jest dostępne niezależnie od trybu zgodności:

<![if IE]> 
<script>
if(typeof document.documentElement.style.opacity!='undefined')
{
  //this must be at least IE9 
}
</script>
<![endif]>
Dr Molle
źródło
1
Dzięki doktorze Molle, spróbuję i zdam raport.
Dee2000
Niestety działa to tylko w trybie przeglądarki (menu rozwijane po lewej stronie w narzędziach programistycznych IE9). Nie działa w trybie dokumentu (menu rozwijane po prawej stronie). W trybie dokumentu działa tylko w trybie dokumentu IE9. Jeśli jest w trybie IE8, IE7 lub Osobliwości, ta logika zawodzi.
Dee2000
7
Cholera, masz rację. Znalazłem inną nieruchomość, działa dla mnie w każdym trybie: window.performance
Dr.Molle
@ Dee2000: U mnie działa również z DocumentMode. Tzn. TYLKO jeśli DocumentMode = "standard Internet Explorer 9" czy ten test powiedzie się.
Niklas Bäckman
@ Dr. Molle dzięki za to, window.performance ładnie wykonuje swoją pracę.
lewsid
3

Czasami konieczne jest odczytanie ciągu agenta użytkownika z serwera Variable, a nie z obiektu nawigatora javascript.

Porównaj różnice:

  • ASP classic, IE11

    • klient javascript, navigator.userAgent: " Mozilla / 5.0 (kompatybilny; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS)

    • serwer ASP, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; BOIE9; ENUS; rv: 11.0) jak Gecko "

  • ASP classic, tryb zgodności IE11 :

    • klient javascript, navigator.userAgent: " Mozilla / 5.0 (kompatybilny; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS))

    • serwer ASP, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 4.0 (kompatybilny; MSIE 7.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS)

Pažout
źródło
0

Z https://stackoverflow.com/a/29288153/2879498

Zakładając, że masz ukryty element z ostrzeżeniem o zgodności z identyfikatorem:

JavaScript z jQuery:

$(function(){
    function showCompatWarning() {
        $('#compat-warning')
            .css('display','block')
            .css('height','auto')
            .show();
    }
    var tridentOffset = navigator.appVersion.indexOf('Trident/');
    if ( tridentOffset === -1 ) return;
    var jscriptVersion = 0;
    /*@cc_on @*/
    /*@if (@_jscript) jscriptVersion = @_jscript_version ; @*/;
    /*@end @*/
    var tridentVersion = parseInt(navigator.appVersion.substr(tridentOffset+8),10);
    var guessIEVersion = tridentVersion + 4;
    if (( document.documentMode && jscriptVersion && jscriptVersion < 10 && jscriptVersion !== document.documentMode ) ||
        ( document.compatMode && document.compatMode === 'BackCompat') ||
        ( document.documentMode && document.documentMode < 10 && document.documentMode != guessIEVersion ))
        showCompatWarning();
});

Wykrywanie i ostrzeżenia, pierwsza i ostatnia linia obrony przed piekłem kompatybilności.

TylerY86
źródło