Мне нужно знать, действительно ли браузер, который идентифицирует себя через строку пользовательского агента как IE7 или IE8, является этими браузерами, или это IE9 в режиме совместимости 7 или 8.
Из того, что я вижу в строке пользовательского агента, IE9 в режиме совместимости с IE7 предоставляет строку, идентичную реальному IE7. Есть ли дополнительное свойство / элемент / объект, который я могу протестировать, чтобы увидеть, "действительно ли" замаскированный IE9?
Я предполагаю, что режим документа не поможет, так как страница, на которую загружен мой скрипт, может либо вызывать причуды, либо устанавливать определенные настройки.
Я надеюсь, что IE9 будет иметь какое-то свойство, которое существует и может быть протестировано независимо от того, находится ли он в режиме 7, 8 или 9.
Отредактировано, чтобы добавить…
Хорошо, теперь я понимаю, в чем я ошибся. Я использовал раскрывающийся список «Режим браузера» и переключал его на IE8 и IE7 и думал, что это «режим совместимости с IE8» и «режим совместимости с IE7» соответственно. Это, конечно, неправда. Режим браузера инструментов разработчика действительно переключает его, чтобы он «походил» на те старые браузеры, так что совершенно правильно, если будут сообщены исходные строки агента пользователя.
Если я выйду из режима браузера в режиме совместимости с IE9 или IE9 и вместо этого попробую вариант с раскрывающимся списком режима документа, тогда я действительно получу «Trident / 5.0» во всех 8 комбинациях (два режима браузера и 4 режима документов). Мне просто нужно избегать выбора режима браузера IE7 и IE8, потому что они действительно (имитируются) IE7 и IE8.
Таким образом, ни страница, ни пользователь, не являющийся разработчиком, метатег или список совместимости Microsoft не смогут перевести IE9 в это неидентифицируемое состояние.
Достаточно просто использовать if(navigator.userAgent.indexOf("Trident/5")>-1)
.
Не волнуйтесь, это не касается стилей, форматирования, логики или содержимого страницы. Для этого я использую функцию обнаружения. Мне просто нужно обнаружить IE9 (независимо от того, в каком он режиме) и принять решение о несанкционированном содержании страницы.
Спасибо, что направили меня к ответу своими предложениями и ссылками.
Ответы:
На самом деле строка пользовательского агента отличается для IE9 при запуске в режиме совместимости с IE7, так что это был бы один из лучших способов различать разные версии IE.
Представляем строку пользовательского агента IE9 :
(курсив добавлен мной). Таким образом, строка пользовательского агента та же самая, что и «Mozilla / 4.0» и MSIE 7.0, но IE9 всегда будет Trident / 5.0 - независимо от того, написано ли там MSIE 7.0, MSIE 8.0 или MSIE 9.0.
На самом деле вам стоит проверить эту замечательную компиляцию: Строки идентификатора браузера (User-Agent) или еще лучше useragentstrings.com
источник
document.documentMode
лучший способ для режима документа.источник
<script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>
. Настоящий (!) IE7 и все не-IE возвращают undefined, только IE8 / 9 в Comp. mode return 7. Я не могу протестировать IE10, но он должен быть таким же.IE7 не содержит информации о Trident
User-Agent : Mozilla/4.0 (compatible; MSIE 7.0)
IE8 содержит эту строку: "Trident / 4.0"
User-Agent : Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0)
IE9 содержит эту строку: "Trident / 5.0"
IE9 в режиме совместимости:
User-Agent : Mozilla/4.0 (compatible; MSIE 7.0; Trident/5.0)
IE9 в обычном режиме:
User-Agent : Mozilla/5.0 (compatible; MSIE 9.0; Trident/5.0)
источник
Вот таблица всех режимов браузера и документа для IE9 :
источник
Я надеюсь, что IE9 будет иметь какое-то свойство, которое существует и может быть протестировано независимо от того, находится ли он в режиме 7, 8 или 9.
Проверьте, например, style.opacity , он был введен в IE9 и доступен независимо от режима совместимости:
<![if IE]> <script> if(typeof document.documentElement.style.opacity!='undefined') { //this must be at least IE9 } </script> <![endif]>
источник
Иногда необходимо прочитать строку пользовательского агента из переменной сервера, а не из объекта навигатора javascript.
Сравните различия:
Классический ASP, IE11
клиентский javascript, navigator.userAgent: « Mozilla / 5.0 (совместимый; 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) "
сервер ASP, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; BOIE9; ENUS; rv: 11.0) как Gecko "
Классический ASP, режим совместимости IE11 :
клиентский javascript, navigator.userAgent: « Mozilla / 5.0 (совместимый; 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)) "
сервер ASP, Request.ServerVariables («HTTP_USER_AGENT»): « Mozilla / 4.0 (совместимый; 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) "
источник
С https://stackoverflow.com/a/29288153/2879498
Предполагая, что у вас есть скрытый элемент с предупреждением о совместимости идентификатора:
Javascript с 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(); });
Обнаружение и предупреждения, ваша первая и последняя линия защиты от ада совместимости.
источник