web-dev-qa-db-fra.com

Émule IE7 pour IE8 mais pas pour IE9 avec "X-UA-Compatible"

J'ai un site Web en fonction du dessin vectoriel. Pour Internet Explorer, j'utilise VML et pour d'autres navigateurs, j'utilise SVG . Cependant, IE8 ne prend pas en charge pour ni sans revenir en arrière à IE7-mode qui a VML.

Par conséquent, j'inclus <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />.

Le problème (enfin, c’est une bonne chose), c’est que IE9 prend maintenant en charge le format SVG, je ne veux donc pas qu’il retombe en mode IE7, dont les performances et la compatibilité sont bien pires. Comment puis-je dire à IE8 seul de revenir en mode IE7 tout en laissant IE9 rester en mode IE9?

À l'heure actuelle, je vérifie si l'agent doit inclure la chaîne EmulateIE7 dans la tête ou non, mais je veux éviter cela autant que possible.

42
Urjan

Je viens d'avoir une pièce et j'ai trouvé les œuvres suivantes:

<meta http-equiv="X-UA-Compatible" content="IE=7,IE=9" >

C'est avec une virgule, pas un point-virgule!

Je n'ai pas examiné les spécifications, mais le format est similaire à content = "IE = 7, chrome = 1", ce qui fonctionne pour Chrome Frame. J'ai aussi constaté que content = "IE = 7,9" fonctionnait mais je soupçonne que ce n'est pas un format correct.

Modifier:

Méfiez-vous des problèmes sérieux si votre page se trouve dans un iframe. Si vous utilisez ce qui précède dans une page encadrée où le parent est en mode any inférieur à IE9 strict, alors IE9 basculera en mode IE8 (en ignorant la requête IE = 7!). Toutes les solutions de contournement connues sont les bienvenues :) Ne sera peut-être pas pertinent pour IE11.

Ce qui précède semble être l’un des effets secondaires de la caractéristique de conception intrinsèque, à savoir que les iframes (et les images présumées) sont tous en mode IE9 ou sont tous inférieurs au mode IE9. On ne peut jamais mélanger des cadres IE9 avec des cadres <IE9, voir MS issues # 599022 et # 635648 .

Edit 2:

Notez que IE11 ne prend en charge que "IE = Edge" (pas IE = 11) et que l'utilisation de IE = Edge a des effets importants sur la fonctionnalité IE (y compris l'agent utilisateur).

Edit 3:

  • Organigramme fantastique expliquant comment IE définit le mode à utiliser pour IE9
  • IE=Edge est pris en charge par IE8 à IE11.
  • La balise Meta est prioritaire sur l'en-tête HTTP (qui peut être utilisé à la place de la balise Meta)
  • Un peu plus Info compatible X-UA pour IE10 .

Edit 4:

X-UA-Compatible a été supprimé du navigateur Microsoft Edge. Seul Internet Explorer dispose des modes de compatibilité. Attention, si vous utilisez WebView dans une application sous Windows Phone 10, vous utilisez toujours IE11 (et non pas Edge).

De plus, pour diverses raisons, vous ne pouvez pas faire confiance à l'agent utilisateur pour vous indiquer le niveau de compatibilité approprié, utilisez plutôt document.documentMode à partir de JavaScript.

41
robocat

Le mode double mentionné par quelqu'un d'autre devrait fonctionne (mais ne fonctionne pas comme le montre Microsoft) et constitue la chose la plus proche que j'ai vue dans la documentation MS qui devrait fonctionner comme décrit. Une mise à jour ci-dessous montre la forme que devrait prendre la valeur du méta-attribut. 

Donc si vous utilisez ceci: 

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7; IE=EmulateIE9">

Malheureusement, vous obtiendrez un rendu IE8 en tant que IE8 en raison de la vectorisation floue de la version effectuée par le moteur compatible x-ua. Voir ce document: Définition de la compatibilité des documents: Comprendre les valeurs des attributs de contenu sur MSDN. Dans cette section, vous verrez que dans la première moitié, ils définissent tout vecteur de version défini comme étant plus grand que la version actuelle du navigateur sera interprété comme le plus grand moteur de rendu disponible. Par conséquent, emulateIE9 est traduit en imulateIE8. Stupide. 

Ensuite, dans le même souffle, ils parlent d'utiliser plusieurs vecteurs de version, comme dans l'extrait de code ci-dessus, pour exclure un moteur particulier. Mais à cause de la logique de version floue, cela ne fonctionnerait jamais. Ah, Microsoft. Échouer à nouveau.

La raison pour laquelle utiliser des CC autour de la méta ne fonctionnera pas, c'est que le navigateur doit avoir choisi un moteur de rendu au moment où il rencontre un CC. La méta x-ua doit précéder tout ce qui figure dans l'en-tête, à l'exception des autres métas ou du titre, selon la propre documentation de MS.

Si quelqu'un peut comprendre cela, je suis tout ouïe parce que je suis désespéré d'exclure IE8 du support tout en incluant IE9. 

MISE À JOUR IMPORTANTE

Robocat indique que la bonne façon de procéder consiste à utiliser une virgule au lieu d'un point-virgule, comme le montre Micrsoft. Je l'ai testé et cela a fonctionné pour moi. J'ai mis à jour ma page de test

Donc, la forme correct est la suivante (comme suggéré par robocat): 

<meta http-equiv="X-UA-Compatible" content="IE=7, IE=9">

Le formulaire incorrect est le suivant (comme suggéré par Microsoft): 

<meta http-equiv="X-UA-Compatible" content="IE=7; IE=9">
27
squareman

Si vous voulez que IE 8 utilise les normes IE7 et que IE 9 utilise les normes IE9, celle-ci a fonctionné pour moi:

<meta http-equiv="X-UA-Compatible" content="IE=7, IE=9">

Pour IE9, cela me donne le mode de compatibilité IE 9 avec IE 9 normes . Pour IE8, cela me donne le mode Navigateur IE8 Mode de document Mode IE

3
J F

J'ai jusqu'à présent utilisé tout cela, rien ne fonctionne sur IE9:

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" >
<meta http-equiv="X-UA-Compatible" content="IE=8" >

<httpProtocol>
        <customHeaders>
          <clear />
          <add name="X-UA-Compatible" value="IE=EmulateIE8" />
        </customHeaders>
    </httpProtocol>

c'est tellement frustrant, aucune de ces balises méta ne semble fonctionner. Microsoft, Qu'est-ce qui est si difficile à prendre en charge, cela devrait fonctionner dans votre documentation nous devons passer des heures à faire la guerre de navigateur. Vous perdez le temps de tout le monde.

3
Deepfreezed

Celui-ci fonctionne pour IE9 pour moi.

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8"/>
0