Разочарование: невозможно заставить IE 8 перейти в «представление совместимости»! - PullRequest
6 голосов
/ 04 августа 2009

У меня есть два очень разных сайта.Обе они имеют разные ошибки при отображении в режиме браузера «Internet Explorer 8»!

При нажатии кнопки «Просмотр совместимости» рядом с адресной строкой оба сайта выглядят великолепно.Когда я впоследствии смотрю на «Режим браузера» и «Узел документа», используя встроенные «Инструменты разработчика», я также замечаю, что «Режим браузера» - это «Представление IE8 Compat», а «Режим документа» - «Стандарты IE7».».Так же, как я ожидаю, что они будут.

Затем я хочу перевести «Internet Explore 8» в «Режим браузера»: «Представление IE8 Compat», чтобы моим пользователям не пришлось нажимать «Совместимость».кнопка «Просмотр» рядом с адресной строкой, чтобы получить то, что им действительно нужно видеть.

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
    <head>
        <title>Test</title>
        <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
        <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
        <link ... />
        <script ...></script>
    </head>
    <body>
        ...
    </body>
</html>

Затем я перезагружаю веб-сайт, и кнопка «Просмотр совместимости» рядом с адресной строкой исчезает.Как и ожидалось.Когда я потом смотрю на «Режим браузера» и «Узел документа», используя встроенные «Инструменты разработчика», я вдруг вижу то, чего действительно НЕ ожидал.Я ожидал, что «Режим браузера» будет «Сравнение IE8», а «Узел документа» будет «Стандарты IE7», но «Режим браузера» - это «IE8», а «Режим документа» - это «Стандарты IE7», иу веб-сайтов неожиданно появляется новый набор ошибок по сравнению с просмотром в режиме обозревателя «Internet Explorer 8»!

Очень печально, почему я не могу принудительно включить режим обозревателя «IE8 Compat view» вместорежимы "Интернет исследуй 7" или "Интернет исследуй 8"?

Ответы [ 8 ]

5 голосов
/ 04 августа 2009

К Цитировать IEBlog :

«Режим браузера» влияет на пользовательский агент строка, вектор версии, используемый при оценивать условные комментарии и режим рендеринга.

Подробнее о http://msdn.microsoft.com/en-us/library/dd565624(VS.85).aspx.

Как вы можете ясно видеть, вы все равно не сможете повлиять на все эти вещи: к тому времени, когда вы говорите браузеру действовать как IE7, он уже действует как IE8.

Возможно, настоящий вопрос заключается в следующем: Почему для вас так важно, что такое режим браузера? Режим документа - это то, что вас больше всего беспокоит - все, что меняется в режиме браузера, по мере того, как рендеринг связан с тем, что исключено / включено, но проверяется версия, и пользователи все равно не будут искать в инструментах разработчика , поэтому им все равно.

Вместо того, чтобы тратить много времени на то, чтобы он выглядел как режим чистой совместимости в инструментах разработчика, вам лучше пойти и убедиться, что проверка строк пользовательского агента и условные комментарии делают так, чтобы IE7 и IE8 получали одинаковый материал для работать, а затем оставить EmulateIE7 в.

EDIT:

Проблема в проверках вашей версии, и, как я и обещал ниже, я расскажу вам, где проблема.

Если вы используете инструменты разработчика для отладки сценария размещения меню, вы можете покопаться и увидеть, что путь выполнения для get_x_position отличается, когда браузер сообщает о себе как IE7 или IE8: is_ie5up имеет значение true для режима IE7, и false для режима IE8. В результате возвращаются очень разные значения.

На этом этапе мы должны вернуться туда, где установлена ​​эта переменная:

var is_ie5up    = (is_ie6up || (is_ie  && !is_ie3 && !is_ie4));

Как видите, это зависит от значения is_ie6up, поэтому давайте посмотрим на окружающий код ...

var is_ie8up    = (is_ie8   ||  is_ie9up);
var is_ie7up    = (is_ie7   ||  is_ie8up);
var is_ie7up    = (is_ie7);
var is_ie6up    = (is_ie6   || is_ie7);
var is_ie5up    = (is_ie6up || (is_ie  && !is_ie3 && !is_ie4));
var is_ie5_5up  = (is_ie6up || (is_ie && !is_ie3 && !is_ie4 && !is_ie5));

... вы заметили ошибку (подсказка: сравните строки 2 и 4 этого фрагмента)?

Это верно: is_ie6up не установлен в true, если браузер не является точно IE6 или IE7. Правильная строка должна, конечно, читать

var is_ie6up    = (is_ie6   || is_ie7up);

... но подождите. Это тоже не хорошо, потому что строка 3 фрагмента изменяет is_ie7up на true, только если браузер точно IE7! Итак, вам нужно удалить перезапись is_ie7up и исправить настройку is_ie6up.

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

2 голосов
/ 10 августа 2009

Вы правильно установили метатег, но IE8, похоже, использует предыдущий режим рендеринга, пока вы не перезапустите браузер.

Чтобы рассказать, что увидят ваши пользователи:

  1. Нажмите Document Mode на панели инструментов разработчика и посмотрите, какое значение помечено (Page Default).
  2. Перезапустите IE8 и просмотрите документ - теперь IE должен использовать страницу по умолчанию.
1 голос
/ 25 апреля 2014

В моем конкретном случае мой сайт не будет правильно отображаться в Compat View. Я наконец узнал, что режим браузера влияет на строку агента пользователя. Правила стилей моего сайта основаны на User Agent, поэтому некоторые стили просто не применяются в представлении Compat.

Я использовал

document.documentElement.setAttribute('data-useragent', navigator.userAgent);

чтобы позже я мог использовать селекторы атрибутов css, такие как

html[data-useragent*='MSIE 8.0'] p {}

Я решил, добавив:

html[data-useragent*='MSIE 7.0'] p {}

(не заботясь об истинном IE7, так как истинный IE7 все равно не поддерживается)

По моему опыту, разработчик ничего не может сделать, чтобы перевести IE8 из "Режим браузера: IE8 Compat View" в "Режим браузера: IE8". Опять же, я имею в виду BrowserModes, а не DocumentModes (которыми можно управлять с помощью метатегов, заголовков ответов и т. Д.).

1 голос
/ 09 октября 2009

Атрибут xmlns = "http://www.w3.org/1999/xhtml" отменяет метатег. Переместите метатег над html-тегом. Да, верно, над html-тегом. Затем он выполнит emulateIE7 перед запуском javascript. это в IE7, IE8 и Firefox.

0 голосов
/ 12 декабря 2012

Если ваша страница содержит материал ASP.NET Ajax, вам может потребоваться обновить сайт с помощью этого

http://support.microsoft.com/kb/2600088

0 голосов
/ 06 января 2012

Возникла проблема с переводом IE8 в режим документов в стандартах IE8 с использованием HML5 Boilerplate для классического сайта asp. Собирая воедино ответы на этот и другие вопросы, добавляя этот код ВЫШЕ, объявление <doctype>, похоже, решило проблему и вернул Document Mode из IE7 обратно в IE8. <%= response.AddHeader("X-UA-Compatible", "IE=edge") %>

0 голосов
/ 09 июня 2011

Я преобразовывал документ XML, поэтому не мог правильно установить DOCTYPE. Вместо того, чтобы двигаться выше <html>, что является недопустимым XML, я просто помещаю его в заголовок.

В PHP:

header("X-UA-Compatible: IE=7");
0 голосов
/ 04 августа 2009

Не проблема ли в том, что вы используете неправильный тип документа?

Может быть:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

Подробнее см. http://htmlhelp.com/tools/validator/doctype.html.

...