IE11 определяет, включен ли режим совместимости через javascript

Кто-нибудь знает, как проверить, включен ли режим совместимости IE 11, когда я нахожусь на сайте через javascript?

Я добавил URL-адрес в параметры просмотра совместимости списка. Но когда я делаю

navigator.userAgent

в инструментах разработчика, он возвращает

Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0;.NET4.0E;.NET4.0C;.NET CLR 3.5.30729;.NET CLR 2.0.50727;.NET CLR 3.0.30729; InfoPath.3; rv: 11.0), как Gecko

Глядя на веб-сайт Microsoft (http://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx), он говорит

Совместимые ( "совместимые" ) и браузерные ( "MSIE" ) токены удалены.

Любая помощь при обнаружении того, использует ли страница просмотр совместимости через javascript, будет действительно полезна. Спасибо заранее.

Ответы

Ответ 1

решаемые

Искав ответ на этот вопрос сам, я нашел это решение у Ненада Булатовича в другом потоке, но его ответ не был помечен как правильный ответ. Я тестировал это в IE11 и понижался до IE5 и обнаружил, что он работает для IE7-IE11, и это здорово. Я хотел бы поделиться им здесь, если кто-то найдет это полезным.

iecheck.js

function trueOrFalse() {
    return true;
}

function IeVersion() {
    //Set defaults
    var value = {
        IsIE: false,
        TrueVersion: 0,
        ActingVersion: 0,
        CompatibilityMode: false
    };

    //Try to find the Trident version number
    var trident = navigator.userAgent.match(/Trident\/(\d+)/);
    if (trident) {
        value.IsIE = true;
        //Convert from the Trident version number to the IE version number
        value.TrueVersion = parseInt(trident[1], 10) + 4;
    }

    //Try to find the MSIE number
    var msie = navigator.userAgent.match(/MSIE (\d+)/);
    if (msie) {
        value.IsIE = true;
        //Find the IE version number from the user agent string
        value.ActingVersion = parseInt(msie[1]);
    } else {
        //Must be IE 11 in "edge" mode
        value.ActingVersion = value.TrueVersion;
    }

    //If we have both a Trident and MSIE version number, see if they're different
    if (value.IsIE && value.TrueVersion > 0 && value.ActingVersion > 0) {
        //In compatibility mode if the trident number doesn't match up with the MSIE number
        value.CompatibilityMode = value.TrueVersion != value.ActingVersion;
    }
    return value;
}

iecheck.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Testing IE Compatibility Mode</title>
    <script src="iecheck.js" type="text/javascript"></script>
</head>
<body>
<div id="results">Results: </div>
</br>
<script type="text/javascript">

var ie = IeVersion();

document.write("IsIE: " + ie.IsIE + "</br>");
document.write("TrueVersion: " + ie.TrueVersion + "</br>");
document.write("ActingVersion: " + ie.ActingVersion + "</br>");
document.write("CompatibilityMode: " + ie.CompatibilityMode + "</br>");

</script>
</body>
</html>

source: Обнаружить режим совместимости с IE10

Ответ 2

Я написал функцию JavaScript, ie-truth, чтобы сделать именно это. Как это работает, в IE 11, если включен режим совместимости, строка User Agent будет содержать номер версии Trident для IE 11 (7.0), а также номер версии MSIE для более старой версии IE (например, 7.0 для IE 7). Это также относится к режиму совместимости в более старых версиях IE.

Ответ 3

Добавьте это в файл web.config, и приложение перезапишет пользовательские настройки.

<configuration>
  ...
  <system.webServer>
    ...
    <httpProtocol>
        <customHeaders>
          <clear/>
          <add name="X-UA-Compatible" value="IE=8; IE=9; IE=EDGE" />
        </customHeaders>
    </httpProtocol>
    ...
  </system.webServer>
  ...
<configuration>

Ответ 4

Я бы рекомендовал использовать функцию обнаружения функций, а не косвенно запрашивать версию браузера. Так, например, если вам нужна функция API истории HTML 5, сделайте что-то вроде:

if (window.history && window.history.pushState) {
    console.log('This is a SUPPORTED browser');
} else {
    console.log('NO! You require a browser that does X, please try installing ...');
}

Ответ 5

В пользовательский агент статья Cookbook совместимости IE, вы можете сказать, что режим совместимости включен, но только при взаимодействии строки пользовательского агента.

В частности, если токен браузера говорит MSIE 7.0, а токен Trident говорит Trident/7.0, это довольно четкое указание. Тем не менее, изменения в строке UA после RTM от IE11 показывают, что вы не можете - и не должны - полагаться на нее как на предсказуемый ресурс в будущих версиях.

Чтобы узнать больше об отдельных токенах, см. раздел Понимание строк пользовательского агента. (Это не совсем актуально, но то, что кажется соответствующим вашим интересам).

Надеюсь, что это поможет...

- Лэнс

Ответ 6

A надежное решение вы можете edit, что работает для Internet Explorer с 8 по 11 (требуется дополнительный код для поддержки < IE8).

Неприятные побочные эффекты (только если IE < 11 или documentMode < 11 - ouch):

  • вызывает проблемы с помощью //@ sourceMappingURL=xx.js (например, в jQuery < 1.11 или других библиотеках, которые не обновлены до более поздней версии //#).
  • По-видимому @cc_on резко замедляет оценку js (re Paul Irish, который знает свои вещи).

Основная причина, по которой он работает, заключается в следующем:

var ieRealVersion = Function('return /*@cc_on @[email protected]*/;')();

возвращает реальную версию IE независимо от режима совместимости. Примечания:

  • ieRealVersion undefined для IE11 в режиме IE11, но document.documentMode == 11 в этом случае.
  • ieRealVersion - 5.8 для IE8.
  • ieRealVersion - 5,7 для IE7, а также 5.7 для IE6 SP3. Однако documentMode undefined, поэтому вам нужен дополнительный код для обнаружения фактического браузера (довольно тривиальный, но я больше не поддерживаю IE6/7, поэтому я не удосужился его кодировать).
  • Это надежный способ обнюхать Internet Explorer 6-10, который я использовал в течение многих лет без проблем (но это вызвало проблемы для других из-за @cc_on).