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, была бы действительно полезной. Заранее спасибо.


person slee    schedule 12.01.2015    source источник
comment
Вы изучили document.compatMode и documentMode? (Сейчас я не знаю, актуальны ли они / доступны ли они в IE 11.)   -  person CBroe    schedule 13.01.2015
comment
stackoverflow.com/questions/14791619/   -  person Ron Gilchrist    schedule 13.01.2015
comment
Могу я спросить, почему вы хотите знать, находится ли пользователь в режиме совместимости?   -  person Sampson    schedule 13.01.2015
comment
Я просто провожу небольшое тестирование. В предыдущих версиях IE на панели URL-адресов был значок неработающей страницы. но в IE 11 нет способа определить, использует ли страница совместное представление или нет.   -  person slee    schedule 13.01.2015
comment
@slee Вы проверили document.documentMode?   -  person Sampson    schedule 13.01.2015


Ответы (7)


РЕШЕНО

Сам искал ответ на этот вопрос, но нашел решение Ненада Булатовича в другой ветке, но его ответ не был отмечен как правильный. Я протестировал это в 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>

источник: Определить режим совместимости IE10

person jaegs    schedule 21.01.2016
comment
value.CompatibilityMode = value.TrueVersion != value.ActingVersion; Режим совместимости = причуды. Это не обнаруживает причуд. Это только говорит о том, что IE выполняет эмуляцию более низкой версии, которая сама по себе может быть режимом причуд или стандартным режимом. - person Neolisk; 19.01.2017
comment
Почему здесь JavaScript содержит то же самое, что и ответ, опубликованный почти годом ранее? Хотя я признаю, что лучше опубликовать код вместо ссылки на репозиторий git, это вызывает путаницу, поскольку кажется, что есть два возможных решения. - person JRSofty; 24.04.2017

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

person Gavin.Paolucci.Kleinow    schedule 05.02.2015
comment
Да, отчасти это кажется правильным, однако я обнаружил, что можно принудительно включить режим совместимости для домена с помощью настроек IE 11, а затем сделать так, чтобы веб-сервер объявил X-UA-Compatible: IE=edge. Это переводит его в странный режим полусовместимости, который может что-то сломать (например, Google Recaptcha). Этот конкретный случай невозможно обнаружить с помощью строки пользовательского агента. - person Simon East; 07.12.2015
comment
@SimonEast, я изо всех сил пытаюсь найти способ гарантировать, что капча Google не нарушена для пользователей IE, не заставляя пользователя вмешиваться в настройки своего браузера. У меня есть открытый вопрос, и я меня заинтересуюсь любыми решениями, которые вы, возможно, придумали. (stackoverflow.com/questions/42768017/) - person Drew; 13.03.2017

Добавьте это в файл 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>

Поместите тег «system.webServer» в конец файла web.config непосредственно перед закрывающим тегом «конфигурация». Кроме того, вы можете добавить тег X-UA-Compatible в IIS на своем веб-сервере, выбрав свой веб-сайт и щелкнув значок заголовков ответа HTTP.

person Kris Truyens    schedule 12.12.2016
comment
В какой раздел web.config это должно входить? Кроме того, принудительно включается или выключается режим совместимости? - person BoltBait; 26.01.2017
comment
Это принудительно отключает режим совместимости. Иерархия того, куда он идет, теперь в ответе. - person Jason Dimmick; 20.07.2017

Я бы порекомендовал использовать обнаружение функций, а не косвенно запрашивать версию браузера. Так, например, если вам требуется функция 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 ...');
}
person geekdenz    schedule 12.10.2016

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

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

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

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

- Лэнс

person Lance Leonard    schedule 18.01.2015

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

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

  • Это вызовет проблемы с //@ sourceMappingURL=xx.js (например, в jQuery ‹1.11 или других библиотеках, которые не обновились в более новый формат //#).
  • Очевидно, @cc_on резко замедляет оценку js (о Поле Айрише, который знает свое дело).

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

var ieRealVersion = Function('return /*@cc_on @_jscript_version@*/;')();

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

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

Простое решение, попробуйте в консоли:

if (typeof(window.getSelection) == "undefined") {
   alert("Unsupported browser!");
} else {
   alert("Supported browser");
}

Обнаружит любой IE ниже IE9 (включая представление совместимости). Также обнаружил бы Chrome 4-14 согласно caniuse.

IE 6-8: поддерживает события выбора, но не window.getSelection () Ссылка: https://caniuse.com/#feat=selection-api.

person user1775054    schedule 03.01.2019