JavaScript: Могу ли я определить IE9, если он находится в режиме совместимости IE7 или IE8? - PullRequest
87 голосов
/ 29 апреля 2011

Мне нужно знать, действительно ли браузер, идентифицирующий себя через строку пользовательского агента как IE7 или IE8, действительно является этими браузерами, или это IE9 в режиме совместимости 7 или 8.

Из того, что я вижу в строке пользовательского агента, IE9 в режиме совместимости с IE7 предоставляет строку, идентичную реальной IE7. Есть ли дополнительное свойство / элемент / объект, который я могу проверить, чтобы увидеть, действительно ли это замаскированный IE9?

Я предполагаю, что режим документа не поможет, поскольку страница, на которую загружен мой скрипт, может вызывать причуды или определенные настройки.

Я надеюсь, что у IE9 будет какое-то свойство, которое существует и может быть проверено независимо от того, находится ли он в режиме 7, 8 или 9.


Отредактировано, чтобы добавить…

Ладно, теперь я понимаю, в чем дело. Я использовал раскрывающийся список «Режим браузера» и переключил его на IE8 и IE7 и подумал, что это «Режим совместимости IE8» и «Режим совместимости IE7» соответственно. Это конечно не правда. Режим Браузера инструментов разработчика действительно переключает его, чтобы он «походил» на те старые браузеры, так что совершенно правильно сообщать об исходных строках userragent.

Если я выйду из режима браузера в режиме совместимости с IE9 или IE9 и попробую вместо этого варианты раскрывающегося списка режимов документа, то фактически получу «Trident / 5.0» во всех 8 комбинациях (два режима браузера и 4 режима документа). Мне просто нужно избегать выбора режима браузера IE7 и IE8, потому что они действительно (имитируются) IE7 и IE8.

Так что ни одна страница, пользователь, не являющийся разработчиком, метатег или список совместимости Microsoft не смогут перевести IE9 в это неидентифицируемое состояние.

Достаточно просто использовать if(navigator.userAgent.indexOf("Trident/5")>-1).

Не волнуйтесь, это не для стилей, форматирования, логики или содержимого страницы. Я использую функцию обнаружения для этих вещей. Мне просто нужно определить IE9 (независимо от того, в каком режиме он находится) и принять решение, не относящееся к содержимому страницы.

Спасибо, что направили меня к ответу с вашими предложениями и ссылками.

Ответы [ 7 ]

67 голосов
/ 29 апреля 2011

На самом деле строка пользовательского агента отличается для IE9 при работе в режиме совместимости с IE7, поэтому это будет одним из лучших способов различать разные версии IE.

Представляем пользовательский агент IE9 String :

Аналогично IE8, совместимость с IE9 Вид будет соответствовать стандарту IE7, и строка UA IE9, когда в Представление совместимости будет:

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

В представлении совместимости IE9 сообщает сам как IE7 через приложение номер версии (Mozilla / 4.0) и маркер версии (MSIE 7.0). Готово для совместимости. Инкремент Жетон Trident, от «Trident / 4.0» до ‘Trident / 5.0’, позволяет веб-сайтам различать IE9 работает в Compat View и IE8 работают в Compat View .

(акцент добавлен мной). Таким образом, строка пользовательского агента такая же, как она сообщает, что она «Mozilla / 4.0» и MSIE 7.0, но IE9 всегда будет Trident / 5.0 - независимо от того, говорит ли он MSIE 7.0, MSIE 8.0 или MSIE 9.0.

На самом деле вы должны проверить этот замечательный сборник: Идентификатор браузера (User-Agent) Строки или даже лучше useragentstrings.com

47 голосов
/ 07 августа 2012

document.documentMode - лучший способ для режима документа.

20 голосов
/ 29 августа 2012

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)
17 голосов
/ 16 января 2013
11 голосов
/ 29 апреля 2011

Я надеюсь, что IE9 будет иметь какое-то свойство, которое существует и может быть проверено независимо от того, находится ли оно в режиме 7, 8 или 9.

Проверьте, например, для стиля .непрозрачность , она была представлена ​​в IE9 и доступна независимо от режима совместимости:

<![if IE]> 
<script>
if(typeof document.documentElement.style.opacity!='undefined')
{
  //this must be at least IE9 
}
</script>
<![endif]>
3 голосов
/ 08 ноября 2013

Иногда необходимо прочитать пользовательскую строку агента с переменной сервера, а не из объекта навигатора javascript.

Сравните различия:

  • ASP classic, 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; Медиа-центр ПК 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 classic, 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; Медиа-центр ПК 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS)"

0 голосов
/ 08 апреля 2015

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

Предполагается, что у вас есть скрытый элемент с ID compat-warning:

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

Обнаружение и предупреждения, ваши первые и последние линии защиты от ада совместимости.

...