web-dev-qa-db-fra.com

JavaScript: Puis-je détecter IE9 s'il est en mode de compatibilité IE7 ou IE8?

J'ai besoin de savoir si le navigateur qui s'identifie via IE2 ou IE8 via la chaîne d'agent d'utilisateur est réellement ce type de navigateur, ou s'il s'agit d'IE9 en mode de compatibilité 7 ou 8.

D'après ce que je peux voir dans la chaîne de l'agent utilisateur, un IE9 en mode de compatibilité IE7 fournit une chaîne identique à un véritable IE7. Existe-t-il une propriété/un élément/un objet supplémentaire que je peux tester pour voir si c'est "vraiment" IE9 déguisé?

Je suppose que le mode de document ne va pas aider car la page dans laquelle mon script est chargé pourrait soit forcer des bizarreries ou forcer un paramètre spécifique.

J'espère que IE9 aura une propriété qui existe et qui peut être testée, que ce soit en mode 7, 8 ou 9.


édité pour ajouter…

OK, je vois où je me suis trompé maintenant. J'utilisais le menu déroulant "Mode navigateur" et le basculais vers IE8 et IE7, pensant qu'il s'agissait respectivement du "mode de compatibilité IE8" et du "mode de compatibilité IE7". Ceci n'est bien sûr pas vrai. Le mode navigateur des outils de développement est en train de le changer pour "ressembler" à ces anciens navigateurs, il est donc normal que les chaînes useragent d'origine soient signalées.

Si je quitte le mode navigateur dans la compatibilité IE9 ou IE9 et que j'essaie plutôt les variantes de liste déroulante en mode document, alors, effectivement, j'obtiens "Trident/5.0" dans les 8 combinaisons (deux modes navigateur et 4 modes document). Je dois juste éviter le choix du mode de navigateur IE7 et IE8 car ils sont réellement (simulés) IE7 et IE8.

Il est donc impossible qu'une page, un utilisateur non-développeur, une balise méta ou la liste de compatibilité de Microsoft puisse mettre IE9 dans cet état non identifiable.

Le simple fait d'utiliser if(navigator.userAgent.indexOf("Trident/5")>-1) suffira.

Ne vous inquiétez pas, ce n'est pas pour les styles, le formatage, la logique ou le contenu de la page. J'utilise la détection de fonctionnalités pour ces choses. Je dois juste détecter IE9 (quel que soit le mode utilisé) et prendre une décision concernant le contenu sans page.

Merci de me guider vers la réponse avec vos suggestions et liens.

87
Dee2000

En réalité, la chaîne d'agent d'utilisateur est différente pour IE9 lorsqu'elle est exécutée en mode de compatibilité IE7. Ce serait donc l'un des meilleurs moyens de distinguer les différentes versions IE.

Présentation de la chaîne d’agent d’utilisateur de IE9 :

Semblable à IE8, l’Affichage de compatibilité d’IE9 mappera au mode Normes IE7, et la chaîne UA de l’Ie9 en affichage de compatibilité sera:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)

Dans Affichage de compatibilité, IE9 se présente sous le nom IE7 via le numéro de version de l'application (Mozilla/4.0) et le jeton de version (MSIE 7.0). Ceci est fait pour la compatibilité. Un jeton Trident incrémenté, de "Trident/4.0" à "Trident/5.0", permet aux sites Web de faire la distinction entre IE9 s'exécutant dans Compat View et IE8 s'exécutant dans Compat View .

(italique ajouté par moi). Ainsi, la chaîne de l'agent utilisateur est la même, car elle se présente comme "Mozilla/4.0" et MSIE 7.0, mais IE9 sera toujours Trident/5.0, qu'il s'agisse de MSIE 7.0, MSIE 8.0 ou MSIE 9.0.

En fait, vous devriez jeter un coup d'œil à cette superbe compilation: ID du navigateur (chaînes User-Agent) ou même mieux seragentstrings.com

67
Dennis G

document.documentMode est le meilleur moyen de passer en mode document.

47
Yuhong Bao

IE7 ne contient aucune information sur Trident

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0)

IE8 contient cette chaîne: "Trident/4.0"

User-Agent : Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0)

IE9 contient cette chaîne: "Trident/5.0"

IE9 en mode de compatibilité:

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0; Trident/5.0)

IE9 en mode normal:

User-Agent : Mozilla/5.0 (compatible; MSIE 9.0; Trident/5.0)
20
Greg
17

J'espère que IE9 aura une propriété qui existe et peut être testée, que ce soit en mode 7, 8 ou 9.

Vérifiez par exemple pour style.opacity, il a été introduit dans IE9 et est disponible quel que soit le mode de compatibilité utilisé:

<![if IE]> 
<script>
if(typeof document.documentElement.style.opacity!='undefined')
{
  //this must be at least IE9 
}
</script>
<![endif]>
11
Dr.Molle

Il est parfois nécessaire de lire la chaîne d'agent utilisateur à partir de la variable serveur et non à partir de l'objet navigateur javascript.

Comparez les différences:

  • ASP classique, IE11

    • client javascript, navigator.userAgent: "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS) "

    • serveur ASP, Request.ServerVariables ("HTTP_USER_AGENT"): "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; BOIE9; ENUS; plage: 11.0) comme Gecko"

  • ASP classic, Mode de compatibilité IE11 :

    • client javascript, navigator.userAgent: "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS))) "

    • serveur ASP, Request.ServerVariables ("HTTP_USER_AGENT"): "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5. 30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS) "

3
Pažout

De https://stackoverflow.com/a/29288153/2879498

En supposant que vous ayez un élément caché avec l'ID compat-warning:

Javascript avec jQuery:

$(function(){
    function showCompatWarning() {
        $('#compat-warning')
            .css('display','block')
            .css('height','auto')
            .show();
    }
    var tridentOffset = navigator.appVersion.indexOf('Trident/');
    if ( tridentOffset === -1 ) return;
    var jscriptVersion = 0;
    /*@cc_on @*/
    /*@if (@_jscript) jscriptVersion = @_jscript_version ; @*/;
    /*@end @*/
    var tridentVersion = parseInt(navigator.appVersion.substr(tridentOffset+8),10);
    var guessIEVersion = tridentVersion + 4;
    if (( document.documentMode && jscriptVersion && jscriptVersion < 10 && jscriptVersion !== document.documentMode ) ||
        ( document.compatMode && document.compatMode === 'BackCompat') ||
        ( document.documentMode && document.documentMode < 10 && document.documentMode != guessIEVersion ))
        showCompatWarning();
});

Détection et avertissements, votre première et dernière ligne de défense contre l'enfer de la compatibilité.

0
TylerY86