Дифференцировать браузер IE7 и браузер в режиме совместимости с IE7

могу ли я различать, является ли браузер клиента IE7 или, например, IE9 в режиме совместимости IE7? Я пытаюсь выяснить, могу ли я сделать проверку JS на своем сайте, которая распознает две разные вещи и делает разные вещи в зависимости от результата

  1. этот браузер IE7
  2. этот браузер находится в режиме совместимости IE7

У меня первое условие работает правильно, так как это в значительной степени сказано везде, как это сделать. Не уверен насчет второго один и / или комбинация обоих.

5 ответов


по крайней мере, для IE8 и IE9 вы можете проверить, есть ли navigator.userAgent есть подстрока Trident в нем. В ИЕ8+ всегда есть Trident в своем user-agent, где IE7 этого не делает. См.ответ и ссылка MSDN в нем.

IE10 кажется сложнее: сообщается в комментариях ниже, что Trident не всегда присутствует в режиме эмуляции IE7. вероятно, строка ОС (например. Windows NT 6.2) все равно покажет IE10, если IE10 не будет доступен ни на одной платформе, где доступен IE7.

пожалуйста, Также обратите внимание, что HTTP User-Agent заголовок может не всегда соответствовать navigator.userAgent. Это относится, по крайней мере, к IE9, который имеет режим совместимости (отправляет IE7 User-Agent заголовок), но обнаруживает что-то вроде IE=Edge в ответ (navigator.userAgent возвращается к IE9).


Я не верю, что есть способ определить, находится ли браузер пользователя в режиме compat. Их строка агента пользователя будет определяться их режимом браузера, а их режим документа будет определяться либо наличием x-ua-compatible мета-тег (или заголовок) или, возможно, используемый doctype.

режим совместимости был предназначен для защиты современного браузера-пользователя от страниц, которые полагались на старые и устаревшие функции или хаки. Это не совсем то, что вы хотели бы протестировать. Вместо этого напишите код, совместимый со стандартами, который будет понятен браузеру в режиме compat или в режиме non-compat.

вот различные результаты различных режимов браузера и режимов документа:

режим браузера: режим просмотра / документа IE10 Compat: стандарты IE7

navigator.userAgent

"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/6.0; 
.NET4.0E; .NET4.0C; Media Center PC 6.0; .NET CLR 3.5.30729; 
.NET CLR 2.0.50727; .NET CLR 3.0.30729; BRI/2)" 

document.documentMode

7

режим браузера: IE7 / режим документа: стандарты IE7

navigator.userAgent

"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; .NET4.0E; 
.NET4.0C; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 2.0.50727; 
.NET CLR 3.0.30729; BRI/2)"

document.documentMode

7

как видим, эти два метода не существует способа сообщите, находится ли пользователь в представлении compat или нет.

Переопределение Списка Представлений Compat

если ваш сайт отображается в списке просмотра совместимости, вы можете переопределить их предлагаемые параметры рендеринга, предоставив свой собственный :

<meta http-equiv="x-ua-compatible" content="IE=9" />

это заставляет ваш браузер в режим стандартов IE9 (без оценки doctype). Вы могли бы использовать IE=edge чтобы заставить его в последний возможный режим (в Internet Explorer 10 это были бы стандарты IE 10), но это не поощрять. Вместо этого установите его в последний режим, с которым вы тестировали.

если x-ua-compatible заголовок установлен в IE10, но пользователь посещает вашу страницу в более раннем браузере, будет использоваться ближайший механизм рендеринга. Например, если пользователь посещает вашу страницу с IE9, и ваш мета-тег указывает браузеру использовать IE10, браузер вернется в режим стандартов IE9.

отметим, что IE=9 заставляет браузер перейти в режим стандартов IE9. Это не обязательно вызывает браузер должен вести себя так, как будто это IE9. Если вы хотите, чтобы браузер вел себя как IE9, вы хотели бы использовать EmulateIE9 содержание:

<meta http-equiv="x-ua-compatible" content="IE=EmulateIE9" />

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

дополнительная информация Определение Совместимости Документов.


для тех, кто достигает этой темы в Google, Вот еще один вариант:

используя скрипт, расположенный по адресуhttp://www.quirksmode.org/js/detect.html....

if (BrowserDetect.browser == 'Explorer')
{
    if (document.documentMode == 7 && BrowserDetect.version > 7)
    {
        // user is running IE in compatability mode
    }
}

это работает для меня:

/**
 * Actual IE8-Browser running in IE8-Compat-Mode or IE7 Mode?
 */
MyUtils.isIE8CompatMode= function(){
    if($.browser.msie && navigator.userAgent.indexOf('MSIE 7.0')>=0){
        return true;
    }
    return false;
}

фактический браузере IE8 есть 3 документа-режимы (ИЕ7, ИЕ8 & закидоны) и 3-браузер-режимы (ИЕ7, ИЕ8 и IE8-совместимость). Мы можем применять документ-режим IE8 с:

 <meta http-equiv="X-UA-Compatible" content="IE=8,chrome=1"/>

но мы не можем обеспечить режим браузера, который определяется конфигурацией браузера. Например: у некоторых наших клиентов установлен флажок "Отображать все страницы в режиме совместимости" в диалоговом окне "совместимость-просмотр-настройки". Если это случае, мы ничего не можем с этим поделать.

см. очень поучительную диаграмму на этом сайте:

->как ie8 определяет режим совместимости

для чего мы используем вышеуказанную функцию? так как наша страница показывает некоторые глюки, когда в режиме совместимости нам нужно сказать пользователю, почему это выглядит плохо и что он может с этим поделать. Поэтому мы используем эту функцию, чтобы сказать, если мы в беде, а затем сделать небольшое предупреждение пользователь.

в режимах совместимости ie9 и ie10 наше приложение выглядит отлично, поэтому нам это не нужно. Этот ответ можно считать ответом на этот вопрос: обнаружение режима совместимости ie8 который был отмечен как дубликат этого. Возможно, это кому-то поможет.


вот довольно пуленепробиваемый чек, который я сделал для крупномасштабного аукционного сайта, базирующегося в Сан-Хосе.

var userAgentString = navigator.userAgent;

if(/MSIE 7\.0/gi.test(userAgentString) && /Trident/gi.test(userAgentString)){
    // compatibility mode
    // .... code goes here ....
}