web-dev-qa-db-fra.com

Détecter le mode de compatibilité IE8

Duplicata possible:
Différencier le navigateur IE7 et le navigateur en mode de compatibilité IE7

Nous n'avons pas eu le temps de tester complètement IE8 avec notre système assez complet. Nous arrivons également au point où nous ne pouvons pas interdire l'utilisation d'IE8. Nos utilisateurs sont têtus et pas terriblement sophistiqués, donc nous ne pensons pas que nous pouvons leur dire d'utiliser le bouton "Mode de compatibilité". Au lieu de cela, nous ajouterons la balise META "IE = EmulateIE7" en tant que correctif temporaire.

Le problème est que lorsque cette balise est utilisée, le navigateur se signale toujours comme IE8, qui est ensuite détecté par nos pages et rejeté. Je peux comprendre pourquoi la détection côté serveur ne peut pas récupérer la balise META (le serveur possède déjà l'agent utilisateur avant l'envoi et le traitement de la balise META), mais les vérifications côté client échouent également. Si le bouton du mode de compatibilité est cliqué sur les machines clientes, l'agent utilisateur est IE7, mais pas si nous utilisons la balise META.

Cela signifie, entre autres, que nous devons désactiver la vérification et ensuite, si nous faisons une erreur quelque part et oublions d'ajouter la balise meta à une page, nous aurons des pages cassées.

Quelqu'un d'autre a-t-il rencontré cela et a-t-il trouvé une meilleure approche? N'y a-t-il aucun moyen de détecter qu'IE8 s'exécute en mode de compatibilité lorsque le mode est défini par la balise META?

Et, nous savons qu'il existe une école de pensée valide selon laquelle nous devrions simplement rendre toutes les pages compatibles avec le mode Normes IE8, mais dans notre petit coin de réalité, ce n'est pas une option réalisable en ce moment (et je soulignerai que nous n'avons pas créé 4 ou 5 versions de IE qui devaient être écrites de manière non standard).

27
don changer

IE8 inclut un jeton Trident dans la chaîne User-Agent quel que soit le mode de compatibilité.

Voir MSDN pour plus de détails: http://blogs.msdn.com/ie/archive/2009/01/09/the-internet-Explorer-8-user-agent-string-updated-edition.aspx

IE7 sur Windows Vista
Mozilla/4.0 (compatible; MSIE 7.0 ; Windows NT 6.0)

IE8 sur Windows Vista (affichage de compatibilité)
Mozilla/4.0 (compatible; MSIE 7.0 ; Windows NT 6.0; Trident/4.0 )

IE8 sur Windows Vista
Mozilla/4.0 (compatible; MSIE 8.0 ; Windows NT 6.0; Trident/4.0 )

24
Lachlan Roche

Vous devez vérifier la valeur de document.documentMode qui aura une valeur de 8 en mode IE8 vrai et de 7 en mode IE7. La chaîne d'agent utilisateur sera identique dans les deux cas et indiquera toujours IE8. Notez que cette variable JavaScript n'est disponible que dans IE8.

12
ferdley

Pour info, pour plus de détails sur la façon de détecter le mode de compatibilité (AKA comment détecter la vue de compatibilité), veuillez considérer le lien suivant ...

http://msdn.Microsoft.com/en-us/library/cc288325 (VS.85) .aspx

... qui affiche des informations utiles.

5
Mark Kamoski

Le problème est en fait encore plus complexe lorsque vous traitez des liens vers votre site à partir de sites BLACKLIST d'émulation IE8 tels que Facebook.

Un lien partagé sur Facebook entraîne l'ouverture de vos liens dans une fenêtre contextuelle - SI LA "INCLURE LA MISE À JOUR DES LISTES WEB" est vérifiée dans les paramètres d'affichage de compatibilité, ce qui est vérifié par défaut, la fenêtre contextuelle voit le référent de la liste noire de Facebook et ouvre la fenêtre dans la liste noire mode initialement. Lors de la détection en arrière-plan de Trident\4.0 - vous verrez la valeur et définissez le CSS de niveau inférieur.

Cependant, après le chargement du navigateur, il quitte le mode Compat et passe en mode STANDARD sans rafraîchissement. Vous avez donc le mauvais CSS pour les modes standard assignés.

Solution - Forcez le navigateur IE à sortir du mode de compatibilité. Oui - cela semble étrange, pourquoi laisser un utilisateur descendre au niveau inférieur sur votre site si vous n'en avez pas besoin.

Tout comme le niveau inférieur, vous définissez IE = EmulateI7 pour forcer le navigateur vers le bas, vous pouvez ajouter IE = EmulateIE8 et forcer l'utilisateur à afficher votre page dans IE8 Standard. ce mode supprime même leur capacité à sélectionner la vue de compatibilité et à réduire vos besoins de test pour ce mode

2
Mark Noblitt

Pas tout à fait "détecter le mode de compatibilité IE8" mais cela pourrait tout aussi bien aider:

Si vous avez accès au serveur lui-même, vous pouvez envoyer un en-tête HTTP, consultez le blog de Mike Ormond à ce sujet . La page MSDN pour Implémentation du Meta Switch sur IIS a des détails sur l'en-tête et comment le définir/l'envoyer.

1
Rob