2010-08-05 20 views
42

Tengo un sitio web que depende del dibujo vectorial, para Internet Explorer estoy usando VML y para otros navegadores estoy usando SVG. IE8 sin embargo, no tiene soporte para ninguno de los dos sin tener que recurrir al modo IE7 que tiene VML.Emular IE7 para IE8 pero no para IE9 usando "X-UA-Compatible"

Por lo tanto, estoy incluyendo <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />.

El problema (bueno, en realidad es algo bueno) es que IE9 ahora tiene soporte para SVG, así que no quiero que vuelva a caer en el modo IE7, que tiene un rendimiento y compatibilidad mucho peores. ¿Cómo le digo solo a IE8 que vuelva al modo IE7 pero que IE9 permanezca en modo IE9?

Ahora estoy haciendo una verificación del lado del servidor del agente, ya sea para incluir el EmulateIE7-string en la cabeza o no, pero quiero evitar esto en la medida de lo posible.

+6

IE 8 es compatible con VML, simplemente cambia la forma en que lo declaras/manejas. Por ejemplo, debe usar * -ms-behavior * en lugar de * behavior *. Más en http://ajaxian.com/archives/the-vml-changes-in-ie-8. –

+3

El modo de estándares IE8 es compatible con VML. Hay todo tipo de problemas (cambios, nuevos errores y pobre rendimiento), pero en principio debería ser posible hacerlo funcionar. Microsoft parece estar dejando que la implementación de VML se degrade con cada versión del navegador; presumiblemente lo consideran una tecnología moribunda. – bobince

+0

Ah, hacer trabajo adicional para obtener una disminución del rendimiento de 10x y errores adicionales no es exactamente tentador. – Urjan

Respuesta

-3
<!--[if IE 8]> 
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> 
<![endif]--> 

Se llama comentarios condicionales
http://en.wikipedia.org/wiki/Conditional_comment

+2

No funciona. IE8 permanece en modo IE8. Parece que el modo de renderizado se selecciona antes de que entren los comentarios condicionales. – Urjan

+11

De hecho, cualquier uso de un comentario condicional corrige el modo documento para que no pueda ser cambiado por un '' posterior. – bobince

+0

Lo siento, no lo he probado. – Sruly

-1

creo que lo que necesita es:

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

acuerdo con http://blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compatibility-features-for-site-developers.aspx como lo describen esto como" ... un ejemplo que combina los valores para que IE8 presente una página web en el modo de estándares IE7, mientras que IE9 representa la página web en el modo de estándares de IE9: "

Sin embargo, por mi parte no puedo hacer que esto funcione.

+0

esto no funciona para mí. –

27

El modo dual señalada por otra persona debe trabajo (pero no qué, como se muestra por Microsoft) y es lo más parecido que he visto en la documentación de MS que debería funcionar como se describe. Hay una actualización a continuación que muestra la forma correcta que debe tomar el valor del atributo meta.

tanto, si utiliza esto:

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

Por desgracia, lo que se obtiene es la representación IE8 IE8 como causa de la versión vectorial difusa que hace que el motor compatible con ua-x. Consulte este documento: Defining Document Compatibility: Understanding Content Attribute Values en MSDN. En esa sección, verá que en la primera mitad, definen cualquier vector de versión definido como más grande que la versión actual del navegador que se interpretará como el motor de representación más grande disponible. Por lo tanto, emulateIE9 get se traduce a emulateIE8. Estúpido.

Luego, en el mismo aliento prácticamente, hablan sobre el uso de vectores de versiones múltiples como en el fragmento de código anterior para excluir un motor en particular. Pero debido a la lógica de la versión difusa, eso nunca funcionaría. Ah, Microsoft. Fallar nuevamente.

La razón por la cual usar CCs alrededor del meta no funcionará, es que el navegador debe haber elegido un motor de renderizado para cuando golpea un CC. La meta x-u debe aparecer antes que cualquier otra cosa en el encabezado, excepto en otras metas o el título de acuerdo con la documentación de MS.

Si alguien puede resolver esto, soy todo oídos porque estoy desesperado por excluir IE8 del soporte mientras incluyo IE9.

importante actualización:

Robocat señala, utilizando una coma en lugar de un punto y coma como muestra Micrsoft es la forma correcta de hacer esto. Lo probé y funcionó para mí. He actualizado mi test page.

Así que la correcta forma es esto (como lo sugiere robocat):

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

El incorrectos forma es esto (según lo sugerido por Microsoft):

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

gracias por esta respuesta informativa. Desearía que tuviera la solución, pero al menos el problema es más claro ahora. –

+1

¡ÉXITO! Gracias a robocat. ¡SÍ! Usar una coma en lugar de un punto y coma parece funcionar. He actualizado mi página de índice para reflejar eso. http://stackoverflow.com/questions/3413629/emulate-ie7-for-ie8-but-not-for-ie9-using-x-ua-compatible/4331124#4331124 – squareman

+1

Confirmado que esto funciona en 9.0.8112.16421 (final lanzamiento). Para el modo de quirks IE7, use:

-1

Wow Microsoft tiene realmente creó una pesadilla aquí. ¡Vamos a hablar de esto en el futuro!

De todos modos, esto funciona para mí.

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

no funciona para mí. ¿Puedes dar tu fuente completa? –

+0

Cambiar el punto y coma por comas, debería funcionar. – unclenorton

+0

Cambié IE = EmulateIE7; IE = IE9 a IE = EmulateIE7; IE = EmulateIE9 – Alex

41

que acaba de tener una obra de teatro y ha encontrado los siguientes trabajos para mí:

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

es decir, con una coma no un punto y coma!

No he visto las especificaciones, pero el formato es similar al content = "IE = 7, chrome = 1" que funciona para Chrome Frame. También encontré que content = "IE = 7,9" funciona pero sospecho que no es un formato correcto.

Editar:

Cuidado con un serio problema si la página está en un marco flotante. Si usa lo anterior en una página enmarcada donde el padre está en cualquier modo menor que IE9 estricto, entonces IE9 regresará al modo IE8 (¡ignorando la solicitud IE = 7!). Cualquier solución temporal conocida es bienvenida :) Puede que no sea relevante para IE11.

Lo anterior parece ser un efecto secundario de la característica de diseño, que iframes (y supongo que marcos) están todos en modo IE9, o todos son menos que el modo IE9. Uno nunca puede mezclar marcos IE9 con < marcos IE9, vea los números MS #599022 y #635648.

Editar 2:

Mira que EI11 sólo admite "IE = borde" (no IE = 11), y que el uso de IE = borde tiene efectos significativos sobre la funcionalidad de IE (incluyendo el agente de usuario).

Datos 3:

  • Fantastic flow chart explicar cómo funciona el modo IE lo que va a utilizar para IE9
  • IE=edge con el apoyo de IE8 a través de IE11.
  • La etiqueta Meta tiene prioridad sobre el encabezado HTTP (que se puede usar en lugar de la etiqueta meta)
  • Algunos más X-UA-Compatible info for IE10.

Editar 4:

X-UA-Compatible se eliminó del navegador Microsoft Edge. Solo Internet Explorer tiene los modos de compatibilidad. Tenga en cuenta que si está usando WebView dentro de una aplicación en Windows Phone 10, entonces todavía está usando IE11 (no Edge).

También por una variedad de razones no puede confiar en que el agente de usuario le diga el nivel de compatibilidad correcto, en su lugar use document.documentMode desde JavaScript.

+1

¿Alguien más ha intentado esto todavía? – robocat

+0

Sí, funciona perfectamente. Usar la coma es vital aquí. Además, no estoy seguro sobre el uso de IE = 7 en lugar de IE = EmulateIE7. – unclenorton

+0

Confirmado que esto funciona en 9.0.8112.16421 (versión final). La toma anterior hace que IE8 se renderice en el modo de estándares IE7 y renderice IE9 en el modo de estándares IE9. Funciona con . Para el modo de IE7 y el modo de estándares IE9, use . –

3

he utilizado hasta ahora todos estos, nada funciona en 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> 

esto es muy frustrante, ninguna de estas etiquetas meta parece estar funcionando. Microsoft, ¿Qué es tan difícil para apoyar cosas que dices que deberían funcionar en tu documentación? tenemos que pasar horas haciendo guerras de navegadores. Estás perdiendo el tiempo de todos.

+1

Aparentemente en IE no podemos poner comentarios condicionales antes del X-UA-Compatible. – Deepfreezed

3

Si desea utilizar el IE 8 estándares IE7 e IE 9 a utilizar las normas IE9 éste trabajó para mí:

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

Para IE9 esto me da IE 9 modo de compatibilidad con los estándares de Internet Explorer 9. Para IE8 esto me da modo de navegador IE8 Document Mode IE7 Estándares

0

Este funciona para IE9 para mí.

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