Подтвердить что ты не робот

Различия браузера IE7 и браузера в режиме совместимости с IE7

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

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

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

4b9b3361

Ответ 1

Для не менее IE8 и IE9 вы можете проверить, есть ли в нем navigator.userAgent подстрока Trident. IE8 + всегда имеет Trident в своем пользовательском агенте, где 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).

Ответ 2

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

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

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

Режим браузера: просмотр в режиме просмотра IE10/режим документа: стандарты 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

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

Список переопределения совместимых сокетов

Если ваш сайт отображается в списке совместимости, вы можете переопределить предлагаемые варианты рендеринга, указав свой собственный заголовок x-ua-compatible:

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

Это заставляет ваш браузер в IE9 Standard Mode (без оценки 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, если он присутствует, чтобы определить, будут ли режимом документа стандартами или Quirks.

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

Ответ 3

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

Используя script, расположенный в 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
    }
}

Ответ 4

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

/**
 * 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 режима документа (IE7, IE8 и Quirks) и 3-Browser-Modes (совместимость с IE7, IE8 и IE8). Мы можем заставить Document-Mode быть IE8 с:

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

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

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

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

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

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

Ответ 5

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

var userAgentString = navigator.userAgent;

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