Переопределить режим совместимости интрасети IE8 - PullRequest
200 голосов
/ 25 марта 2010

По умолчанию IE8 переводит сайты интрасети в режим совместимости. Я попытался изменить мета-заголовок на IE8, но он не подтверждает мета-заголовок и просто использует настройки браузера. Кто-нибудь знает как это отключить?

Ответы [ 19 ]

1 голос
/ 28 июня 2012

Мы можем решить эту проблему в среде Spring-Apache-tomcat, добавив одну строку в метод RequestInterceptor -

//before the actual handler will be executed
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {

// Some logic

// below statement ensures IE trusts the page formatting and will render it acc. to IE 8 standard.
response.addHeader("X-UA-Compatible", "IE=8"); 

return true;
}

Ссылка от - Как создать фильтр и изменить заголовок ответа В нем рассказывается, как мы можем решить эту проблему с помощью RequestInterceptor (Spring).

1 голос
/ 14 декабря 2011

Я боролся с этой проблемой и хотел помочь предложить уникальное решение и понимание.

Некоторые основанные на AJAX фреймворки будут внедрять javascripts и таблицы стилей в начале <head>, и это, по-видимому, мешает правильной работе решения с метатегами. В этом случае я обнаружил, что непосредственная инъекция в заголовок HTTP-ответа, очень похожая на ответ Андраса Цехи, решит проблему.

Однако для тех из нас, кто использует сервлеты Java, хорошим способом решения этой проблемы является использование ServletFilter.

public class EmulateFilter implements Filter {

@Override
public void destroy() {
}

@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
        FilterChain arg2) throws IOException, ServletException {
    HttpServletResponse response = ((HttpServletResponse)arg1);
    response.addHeader("X-UA-Compatible", "IE=8");
    arg2.doFilter(arg0, arg1);
}

@Override
public void init(FilterConfig arg0) throws ServletException {
}

}
0 голосов
/ 19 апреля 2013

Для всех, кто читает это и хочет отключить это через GPO для всех пользователей, это настройка:

Конфигурация компьютера / Административные шаблоны / Компоненты Windows / Internet Explorer / Просмотр совместимости / Включение стандартного режима Internet Explorer для локальной интрасети

хотя редактирование web.config исправило это для меня.

0 голосов
/ 22 февраля 2013

Комментарий Стефана С. о режиме документа по сравнению с режимом браузера был очень уместен для моей проблемы.

У меня есть метаданные X-UA-Content на странице, но я тестировал версию браузера через navigator.appVersion на стороне клиента. Этот тест не отражает метаданные, поскольку он предоставляет режим браузера, а не режим документа.

Ответ для меня состоял в том, чтобы проверить document.documentMode что-то вроде:

function IsIE(n)
{
    if (navigator.appVersion.indexOf("MSIE ") == -1) return false;
    var sDocMode = document.documentMode;
    return (isFinite(sDocMode) && sDocMode==n);
}

Теперь мой мета-тег X-UA-Content отражается в тесте моего браузера.

Почему я нахмурился, протестировав браузер? Скорость. Различные из моих надстроек jQuery, такие как tableorter, слишком медленно работают в IE6 / 7, и я хочу их отключить. Я не уверен, что тестирование функций браузера поможет мне решить эту проблему иначе.

0 голосов
/ 07 сентября 2010

Если вы хотите, чтобы ваш веб-сайт включал режим стандартов IE 8, используйте этот метатег вместе с действительным DOCTYPE:

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />

Обратите внимание на значение «EmulateIE8», а не на простое «IE8».

В соответствии с разработчиками IE это должно выглядеть так: «Отображать DOCTYPE стандартов в режиме стандартов IE8; отображать DOCTYPE Quirks в режиме Quirks. Используйте этот тег, чтобы переопределить представление совместимости на клиентских компьютерах и принудительно перенести стандарты в стандарты IE8».

больше информации об этом посте в IE: http://blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx

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

Добавьте это внутри тега head ваших страниц (для целевой версии IE):

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

Обратите внимание, это НЕ изменит тот факт, что браузер сообщает, что он находится в режиме совместимости (называемом режимом браузера), но страница будет отображаться в режиме стандартов IE8. Если он по-прежнему не отображает, как вы хотите, вероятно, потому что у вас есть JavaScript, который ошибочно проверяет I.E. версия. См. в следующем сообщении в блоге , чтобы определить, из какого свойства вы хотите отключить, потому что , даже если вы установите метатег X-UA-Compatible, в строке агента пользователя все равно будет указано MSIE 7.0,

В моем случае для исправления мне пришлось добавить проверку режима совместимости IE7. Я сделал это, используя простой код JavaScript:

                //IE8 and later will have the word 'trident' in its user agent string.
                if (navigator.userAgent.indexOf("Trident")>-1) { //do something }
0 голосов
/ 16 августа 2011

Была такая же проблема. Работало с использованием

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" />
0 голосов
/ 03 июля 2014

Изменить заголовки в .htaccess

BrowserMatch MSIE ie
Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie

Нашел решение этой проблемы здесь: https://github.com/h5bp/html5-boilerplate/issues/378

0 голосов
/ 07 марта 2012

Этот вопрос является дубликатом Принудительный режим браузера "Internet Explorer 8" в интрасети .

Ответы там показывают, что невозможно отключить представление совместимости (на стороне сервера) - https://stackoverflow.com/a/4130343/24267. Это, безусловно, имеет место, поскольку ни одно из предложенных мною предложений не сработало. В IE8 «Режим браузера» настраивается на просмотр в режиме совместимости Internet Explorer 8 независимо от типа отправляемого вами заголовка, совместимого с X-UA.

Мне пришлось сделать некоторую специальную обработку для IE7 и режима совместимости, из-за чего браузер отображал с использованием IE8, но сообщал, что это был IE7, сломал мой код. Вот как я исправил свой код (я знаю, что это ужасный взлом, и я должен тестировать функции, а не версии браузера):

isIE8 = navigator.appVersion.indexOf("MSIE") != -1 && parseFloat(navigator.appVersion.split("MSIE")[1]) == 8;
if (!isIE8 && navigator.appVersion.indexOf("MSIE") != -1 && parseFloat(navigator.appVersion.split("MSIE")[1]) == 7 && navigator.appVersion.indexOf("Trident") != -1) {
    // Liar, this is IE8 in compatibility mode.
    isIE8 = true;
}
...