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

87

J'ai besoin de savoir si le navigateur qui s'identifie via la chaîne de l'agent utilisateur comme étant IE7 ou IE8 est vraiment ces navigateurs, 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 vrai IE7. Y a-t-il une propriété / élément / objet supplémentaire que je peux tester pour voir si c'est "vraiment" IE9 déguisé?

Je suppose que le mode document n'aidera pas car la page dans laquelle mon script est chargé pourrait forcer des bizarreries ou forcer un paramètre spécifique.

J'espère que IE9 aura une propriété qui existe et est testable indépendamment du fait qu'il soit en mode 7, 8 ou 9.


Modifié pour ajouter…

OK, je vois où je me suis trompé maintenant. J'utilisais le menu déroulant "Mode navigateur" et je le commutais sur IE8 et IE7 et je pensais que c'était respectivement "Mode de compatibilité IE8" et "Mode de compatibilité IE7". Ceci n'est bien sûr pas vrai. Le mode Navigateur des outils de développement le fait vraiment passer 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 en compatibilité IE9 ou IE9 et que j'essaye plutôt les variantes de la liste déroulante du mode document, alors j'obtiens en fait "Trident / 5.0" présent dans les 8 combinaisons (deux modes navigateur et 4 modes document). Je dois juste éviter de choisir le mode navigateur IE7 et IE8 car ils sont vraiment (simulés) IE7 et IE8.

Il n'y a donc aucun moyen pour qu'une page, un utilisateur non développeur, une balise Meta ou une liste de compatibilité de Microsoft puisse mettre IE9 dans cet état non identifiable.

La simple utilisation if(navigator.userAgent.indexOf("Trident/5")>-1)sera suffisante.

Ne vous inquiétez pas, ce n'est pas pour les styles, la mise en forme, la logique ou le contenu de la page. J'utilise la détection de fonctionnalités pour ces choses. J'ai juste besoin de détecter IE9 (quel que soit le mode dans lequel il se trouve) et de prendre une décision concernant le contenu hors page.

Merci de m'avoir orienté vers la réponse avec vos suggestions et liens.

Dee2000
la source
1
Ne faites jamais confiance à l'agent utilisateur ... cela peut parfaitement mentir et il n'y a aucun moyen d'être sûr qu'il dit la vérité ou non ... vous devriez plutôt tester des fonctions ou des fonctionnalités spécifiques
JCOC611
2
@ JCOC611 Oui et non. Il s'agit d'une question spécifique sur la façon de savoir s'il s'agit d'IE9 en vue de la compatibilité, ce qui est une question raisonnable. En général, il ne faut pas se fier aux chaînes d'agent utilisateur pour la fonctionnalité du site, car on peut facilement le simuler, c'est vrai.
Dennis G
1
Même si l'agent utilisateur est précis, il est grandement préférable d'utiliser la détection des fonctionnalités dans la mesure du possible. Ensuite, vous n'avez pas besoin de savoir si IE est ou non en mode de compatibilité en premier lieu.
Dave Ward
1
Je veux juste ajouter que cela est très utile si vous souhaitez fournir un tutoriel rapide aux utilisateurs qui utilisent un mauvais mode de navigateur.
Joost le
1
@ JCOC611 qui usurperait son useragent et s'attendrait à ce que les choses fonctionnent correctement - devrions-nous vraiment nous soucier de ce cas?
JohnnyFaldo

Réponses:

67

En fait, la chaîne de l'agent 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 d'IE.

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

Semblable à IE8, la vue de compatibilité d'IE9 correspondra au mode de normes IE7, et la chaîne UA d'IE9 en vue de compatibilité sera:

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

Dans la vue de compatibilité, IE9 se signale comme 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 fonctionnant dans Compat View et IE8 fonctionnant dans Compat View .

(italiques ajoutés par moi). Ainsi, la chaîne de l'agent utilisateur est la même car elle se rapporte être "Mozilla / 4.0" et MSIE 7.0, mais IE9 sera toujours Trident / 5.0 - peu importe si elle dit MSIE 7.0, MSIE 8.0 ou MSIE 9.0.

En fait, vous devriez consulter cette excellente compilation: Chaînes d'ID de navigateur (User-Agent) ou encore mieux useragentstrings.com

Dennis G
la source
1
Salut moontear. J'ai aussi vu que "Trident / 5.0" est censé être présent quand IE9 est en mode IE7, mais ce n'est pas ce que je vois sur mon IE9 (final) sur Win7 Pro x64. Il ne montre aucun trident en mode IE7 (ce à quoi ressemble le vrai IE7) et il montre le trident 4 en mode IE8 (encore une fois, à quoi ressemble le vrai IE8). J'utilise d'abord la liste déroulante des outils de développement IE9 pour sélectionner le mode navigateur, puis dans la barre d'adresse, j'alerte javascript: alert (navigator.userAgent)
Dee2000
1
"Trident / 5.0" est présent dans la chaîne user-agent d'IE9 dans tous les modes.
EricLaw
Comme le dit EricLaw, Dee. Trident / 5.0 doit être présent lorsque vous utilisez le mode de compatibilité (peut-être différent pour le mode navigateur?). Comment vérifiez-vous la chaîne de l'agent utilisateur? Essayez de vérifier via whatsmyuseragent.com et faites un rapport.
Dennis G
Voir ma réponse ci-dessous (j'ai dû utiliser un autre id Dee2001 en raison d'une règle de 8 heures de dépassement de capacité de pile concernant l'ajout d'une réponse à votre propre message). Oui Eric et Moontear ont tous les deux raison, Trident / 5.0 est présent dans tous les modes d'IE9. Ma grosse erreur a été de changer le "Mode Navigateur" en IE7 ou IE8 dans les outils de développement, mais ce n'est pas un "mode" qu'une page / balise meta / liste de compatibilité peut appliquer. Au lieu de cela, il simule vraiment les navigateurs eux-mêmes, donc naturellement la chaîne useragent est vraiment comme IE7 / 8.
Dee2000
1
C'est parfait! Merci beaucoup. Je ne stylise pas en fonction du navigateur signalé mais je mets en place une barre d'avertissement en haut du site sur lequel je travaille qui indique que l'utilisateur doit mettre à niveau (si les balises conditionnelles indiquent que c'est inférieur ou égal à ie7) - Je ne veux pas que le message dise mise à niveau dans ce cas, mais plutôt désactiver le mode de compatibilité
Chelsea Urquhart
47

document.documentMode est le meilleur moyen pour le mode document.

Yuhong Bao
la source
17
Veuillez développer un peu la réponse. Plus de contexte.
random_user_name
3
Pourquoi les gens ne s'ajoutent-ils pas à cela, c'est exactement ce dont ils ont besoin
Jamie Hutber
5
C'est en effet la meilleure façon. Vous pouvez l' utiliser de cette façon: <script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>. Le vrai (!) IE7 et tous les non-IE renvoient «indéfini», seulement IE8 / 9 dans Comp. mode return 7. Je ne peux pas tester IE10, mais cela devrait être la même chose.
Frank Conijn
2
Juste essayé ceci dans IE10 sur un côté avec la balise META de bord; normalement, il renvoie "10". Forcer le mode de compatibilité sur tous les sites, et il renvoie toujours "10".
Whelkaholism
Fonctionne pour moi dans IE10 et IE11 Preview
Simon Keep
20

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)
Greg
la source
1
C'est génial, IE10 incrémente-t-il également Trident?
slotishtype
3
Internet Explorer 10 utilisateurs Trident / 6.0 .... voir blogs.msdn.com/b/ie/archive/2012/07/12/…
slotishtype
1
et IE11 utilise Trident / 7.0
Dee2000
11

J'espère que IE9 aura une propriété qui existe et est testable indépendamment du fait qu'il soit en mode 7, 8 ou 9.

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

<![if IE]> 
<script>
if(typeof document.documentElement.style.opacity!='undefined')
{
  //this must be at least IE9 
}
</script>
<![endif]>
Dr Molle
la source
1
Merci Dr Molle, je vais essayer et faire un rapport.
Dee2000
Malheureusement, cela ne fonctionne que pour le mode navigateur (le menu déroulant de gauche dans les outils de développement IE9). Cela ne fonctionne pas pour le mode Document (le menu déroulant de droite). Pour le mode document, cela ne fonctionne qu'en mode document IE9. Si c'est en mode IE8, IE7 ou Quirks, cette logique échoue.
Dee2000
7
Merde, votre droit. J'ai trouvé une autre propriété, fonctionne pour moi dans tous les modes: window.performance
Dr.Molle
@ Dee2000: Cela fonctionne aussi pour moi avec DocumentMode. C'est-à-dire UNIQUEMENT si DocumentMode = "Internet Explorer 9 standard" ce test réussit.
Niklas Bäckman
@ Dr.Molle merci pour cela, window.performance fait bien le travail.
lewsid le
3

Il est parfois nécessaire de lire la chaîne de l'agent utilisateur à partir de la variable serveur, et non 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; rv: 11.0) comme Gecko "

  • ASP classique, 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) "

Pažout
la source
0

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

En supposant que vous ayez un élément masqué 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, vos premières et dernières lignes de défense contre l'enfer de la compatibilité.

TylerY86
la source