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.
Odpowiedzi:
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 :
(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
źródło
document.documentMode
to najlepszy sposób na tryb dokumentu.źródło
<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.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)
źródło
Oto tabela wszystkich trybów przeglądarki i dokumentów dla IE9 :
źródło
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]>
źródło
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) ”
źródło
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.
źródło