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

87

Мне нужно знать, действительно ли браузер, который идентифицирует себя через строку пользовательского агента как 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 (независимо от того, в каком он режиме) и принять решение о несанкционированном содержании страницы.

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

Dee2000
источник
1
Никогда не доверяйте пользовательскому агенту ... он может совершенно лгать, и нет способа быть уверенным, говорит ли он правду или нет ... вместо этого вам следует проверить конкретные функции или особенности
JCOC611
2
@ JCOC611 Да и нет. Это конкретный вопрос, как узнать, является ли это IE9 с точки зрения совместимости, что является разумным вопросом. В общем, не следует полагаться на строки пользовательского агента для функциональности сайта, так как это легко подделать, правда.
Dennis G
1
Даже если пользовательский агент точен, гораздо предпочтительнее использовать обнаружение функций, если это вообще возможно. Тогда вам вообще не нужно знать, находится ли IE в режиме совместимости.
Дэйв Уорд
1
Я просто хочу добавить, что это очень полезно, если вы хотите предоставить быстрое руководство для пользователей, которые используют неправильный режим браузера.
Joost
1
@ JCOC611, который будет подделывать свой агент пользователя и ожидать, что все будет работать правильно - должны ли мы действительно заботиться об этом случае?
JohnnyFaldo

Ответы:

67

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

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

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

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

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

Деннис Дж.
источник
1
Привет, Moontear. Я также видел, что "Trident / 5.0" должен присутствовать, когда IE9 находится в режиме IE7, но это не то, что я вижу в моем (последнем) IE9 на Win7 Pro x64. Он вообще не показывает трезубца в режиме IE7 (именно так выглядит настоящий IE7) и показывает трезубец 4 в режиме IE8 (опять же, как выглядит настоящий IE8). Я использую инструменты разработчика IE9 сначала в раскрывающемся списке, чтобы выбрать режим браузера, а затем в адресной строке, предупреждающей javascript: alert (navigator.userAgent)
Dee2000
1
«Trident / 5.0» присутствует в строке пользовательского агента IE9 во всех режимах.
EricLaw
Как говорит Эрик Лоу, Ди. Trident / 5.0 должен присутствовать, когда вы используете режим совместимости (может быть другим для режима браузера?). Как вы проверяете строку пользовательского агента? Попробуйте проверить через whatsmyuseragent.com и сообщите об этом.
Dennis G
См. Мой ответ ниже (мне пришлось использовать другой идентификатор Dee2001 из-за 8-часового правила переполнения стека о добавлении ответа на собственное сообщение). Да Эрик и Moontear оба правильны, Trident / 5.0 есть присутствует во всех режимах в IE9. Моя большая ошибка заключалась в изменении «Режима браузера» на IE7 или IE8 в инструментах разработчика, но это не тот «режим», который может применяться в списке страниц / метатегов / совместимости. Вместо этого он действительно имитирует сами браузеры, поэтому, естественно, строка useragent действительно похожа на IE7 / 8.
Dee2000,
1
Это потрясающе! Спасибо. Я не использую стиль, основанный на сообщенном браузере, но я настраиваю панель предупреждений в верхней части сайта, над которой я работаю, в которой говорится, что пользователю необходимо обновить (если, например, условные теги говорят, что это меньше или равно ie7) - Я не хочу, чтобы сообщение говорило об обновлении в этом случае, а скорее отключило режим совместимости
Челси Уркухарт,
47

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

Юхун Бао
источник
17
Пожалуйста, расширите ответ немного. Больше контекста.
random_user_name
3
Почему люди этого не делают, это именно то, что нужно
Джейми Хутбер,
5
Это действительно лучший способ. Вы можете использовать его таким образом: <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, но он должен быть таким же.
Фрэнк Конейн
2
Только что попробовал это в IE10 на стороне с краевым тегом META; обычно возвращается "10". Принудительно включить режим совместимости для всех сайтов, и он по-прежнему возвращает "10".
Велоголизм
У меня работает в IE10 и IE11 Preview
Simon Keep
20

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)
Грег
источник
1
Замечательно, IE10 также увеличивает Trident?
slotishtype 05
3
Internet Explorer 10 пользователей Trident / 6.0 .... см. Blogs.msdn.com/b/ie/archive/2012/07/12/…
slotishtype 05
1
и IE11 использует Trident / 7.0
Dee2000 08
11

Я надеюсь, что 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]>
Доктор Молле
источник
1
Спасибо, доктор Молле, я попробую и доложу.
Dee2000
К сожалению, это работает только в режиме браузера (левое раскрывающееся меню в инструментах разработчика IE9). Это не работает в режиме документа (правый раскрывающийся список). Для режима документа он работает только в режиме документа IE9. Если он находится в режиме IE8, IE7 или Quirks, эта логика не работает.
Dee2000
7
Блин, ваше право. Я нашел еще одно свойство, которое у меня работает во всех режимах: window.performance
Доктор Молле
@ Dee2000: У меня он работает и с DocumentMode. Т.е. ТОЛЬКО если DocumentMode = "Internet Explorer 9 standard" этот тест проходит успешно.
Niklas Bäckman
@ Dr.Molle спасибо за это, window.performance отлично справляется со своей задачей.
lewsid 06
3

Иногда необходимо прочитать строку пользовательского агента из переменной сервера, а не из объекта навигатора 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) "

Пажут
источник
0

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

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

ТайлерY86
источник