web-dev-qa-db-fra.com

IE11 détecte si la vue de compatibilité est activée via javascript

quelqu'un sait-il comment vérifier si le mode de compatibilité IE 11 est activé lorsque je suis sur un site Web via javascript?

J'ai ajouté l'URL aux paramètres d'affichage de compatibilité de la liste. Mais quand je fais

navigator.userAgent

dans les outils de développement, il revient

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) comme Gecko

En regardant le site Web de Microsoft ( http://msdn.Microsoft.com/en-us/library/ie/hh869301 (v = vs.85) .aspx ), il est dit

Les jetons compatibles ("compatible") et navigateur ("MSIE") ont été supprimés.

Toute aide pour détecter si une page utilise la vue de compatibilité via javascript serait vraiment utile. Merci d'avance.

18
slee

[~ # ~] résolu [~ # ~]

En cherchant moi-même une réponse à cette question, j'ai trouvé cette solution de Nenad Bulatovic dans un autre fil, mais sa réponse n'a pas été marquée comme la bonne réponse. J'ai testé cela dans IE11 et rétrogradé vers IE5 et j'ai constaté que cela fonctionne pour IE7-IE11, ce qui est génial. Je voulais le partager ici au cas où quelqu'un d'autre le trouverait utile.

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: Détecter le mode de compatibilité IE1

22
jaegs

J'ai écrit une fonction JavaScript, ie-vérité , pour faire exactement cela. Comment cela fonctionne est que dans IE 11 si le mode de compatibilité est activé, la chaîne de l'agent utilisateur contiendra le numéro de version Trident pour IE 11 (7.0) as ainsi que le numéro de version MSIE pour une ancienne version de IE (comme 7.0 pour IE 7). Cela s'applique également au mode de compatibilité dans les anciennes versions d'IE .

7

Ajoutez-le au fichier web.config et l'application remplacera les paramètres de l'utilisateur.

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

Placez la balise "system.webServer" à la fin de votre fichier web.config juste avant la balise de fermeture "configuration". De plus, vous pouvez ajouter la balise compatible X-UA dans IIS sur votre serveur Web en sélectionnant votre site Web et en cliquant sur l'icône En-têtes de réponse HTTP.

7
Kris Truyens

Je recommanderais d'utiliser la détection de fonctionnalités plutôt que d'interroger indirectement la version du navigateur. Ainsi, par exemple, si vous avez besoin de la fonctionnalité API d'historique HTML 5, faites quelque chose comme:

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 ...');
}
1
geekdenz

Une solution simple, essayez-la dans la console:

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

Détectera tout IE inférieur à IE9 (y compris la vue de compatibilité). Détecterait également Chrome 4-14 selon caniuse.

IE 6-8: prend en charge les événements de sélection, mais pas window.getSelection () Ref: https://caniuse.com/#feat=selection-api

0
user1775054

Selon l'article agent utilisateur du livre de recettes de compatibilité IE , il existe un moyen de savoir si le mode compat est activé, mais uniquement lorsque la chaîne d'agent utilisateur coopère.

Plus précisément, si le jeton de navigateur indique MSIE 7.0 et le jeton Trident indique Trident/7.0, c'est une indication assez claire. Pourtant, les modifications apportées à la chaîne UA depuis IE11 RTM montrent que vous ne pouvez pas - et ne devez pas - compter sur elle comme ressource prévisible dans les versions futures.

Pour en savoir plus sur les jetons individuels, consultez la rubrique Comprendre les chaînes d'agent utilisateur . (Ce n'est pas entièrement à jour, mais ce qui s'y trouve semble pertinent pour vos intérêts.)

J'espère que cela t'aides...

- Lance

0
Lance Leonard

Une solution fiable vous pouvez éditer qui fonctionne pour Internet Explorer 8 à 11 (nécessite du code supplémentaire pour prendre en charge <IE8).

Effets secondaires désagréables (uniquement si IE <11 ou documentMode <11 - aïe):

  • Cela va causer des problèmes avec //@ sourceMappingURL=xx.js (par exemple dans jQuery <1.11, ou dans d'autres bibliothèques qui n'ont pas été mises à jour vers la plus récente //# format).
  • Apparemment, @cc_on ralentit considérablement l'évaluation js (concernant Paul Irish qui connaît son métier).

La raison fondamentale pour laquelle cela fonctionne est que:

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

renvoie la version réelle de IE quel que soit le mode de compatibilité. Remarques:

  • ieRealVersion n'est pas défini pour IE11 en mode IE11, mais document.documentMode == 11 dans ce cas.
  • ieRealVersion est 5.8 pour IE8.
  • ieRealVersion est 5.7 pour IE7, et aussi 5.7 pour IE6 SP3. Cependant, documentMode n'est pas défini, vous avez donc besoin de code supplémentaire pour détecter le navigateur réel (assez trivial, mais je ne supporte plus IE6/7, donc je n'ai pas pris la peine de coder cela).
  • Il s'agit d'un moyen fiable de flairer pour Internet Explorer 6-10 que j'utilise depuis de nombreuses années sans problème (mais qui a causé des problèmes à d'autres en raison de @cc_on).
0
robocat