JavaScript: Могу ли я определить IE9, если он работает в режиме совместимости с IE7 или IE8?

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

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

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

Я надеюсь, что 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 (независимо от того, в каком режиме он) и принять решение о нестраничном контенте.

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

Ответ 1

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

Представление строки агента пользователя IE9s:

Как и IE8, совместимость с IE9s Просмотр будет отображаться в стандартном режиме IE7, и строку IE9s UA, когда в Просмотр совместимости будет выглядеть следующим образом:

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, работающий в Просмотр совместимости и IE8, работающие на совместимости Вид.

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

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

Ответ 2

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

Ответ 3

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)

Ответ 5

Я надеюсь, что 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]>

Ответ 6

Иногда необходимо прочитать строку агента пользователя из переменной сервера, а не из объекта навигатора 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; 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 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; Media Center PC 6.0;.NET4.0C;.NET4.0E; BOIE9; ENUS)"

Ответ 7

Из fooobar.com/info/64635/...

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

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

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