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.
Réponses:
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 :
(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
la source
document.documentMode
est le meilleur moyen pour le mode document.la source
<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.IE7 ne contient aucune information sur Trident
IE8 contient cette chaîne: "Trident / 4.0"
IE9 contient cette chaîne: "Trident / 5.0"
IE9 en mode de compatibilité:
IE9 en mode normal:
la source
Voici un tableau de tous les modes Navigateur et Document pour IE9 :
la source
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é:
la source
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) "
la source
Sur https://stackoverflow.com/a/29288153/2879498
En supposant que vous ayez un élément masqué avec l'ID compat-warning:
Javascript avec jQuery:
Détection et avertissements, vos premières et dernières lignes de défense contre l'enfer de la compatibilité.
la source