JavaScript: ¿Puedo detectar IE9 si está en modo de compatibilidad IE7 o IE8?

87

Necesito saber si el navegador que se identifica a sí mismo a través de la cadena de agente de usuario como IE7 o IE8 es realmente esos navegadores, o si es IE9 en modo de compatibilidad 7 u 8.

Por lo que puedo ver en la cadena del agente de usuario, un IE9 en el modo de compatibilidad con IE7 proporciona una cadena idéntica a un IE7 real. ¿Hay alguna propiedad / elemento / objeto adicional que pueda probar para ver si es "realmente" IE9 disfrazado?

Supongo que el modo de documento no ayudará ya que la página en la que se carga mi script podría estar forzando peculiaridades o forzando una configuración específica.

Espero que IE9 tenga alguna propiedad que exista y sea comprobable independientemente de si está en modo 7, 8 o 9.


Editado para agregar…

Bien, ahora veo dónde estaba yendo mal. Estaba usando el menú desplegable "Modo de navegador" y lo cambiaba a IE8 e IE7 y pensaba que este era "modo de compatibilidad de IE8" y "modo de compatibilidad de IE7" respectivamente. Por supuesto que esto no es cierto. El modo de navegador de las herramientas de desarrollo realmente lo está cambiando a "ser como" esos viejos navegadores, por lo que es correcto que se informe sobre las cadenas de agentes de usuario originales.

Si dejo el modo de navegador en compatibilidad con IE9 o IE9 y pruebo las variantes desplegables del modo de documento en su lugar, de hecho obtengo "Trident / 5.0" presente en las 8 combinaciones (dos modos de navegador y 4 modos de documento). Solo necesito evitar elegir el modo de navegador IE7 e IE8 porque realmente son (simulados) IE7 e IE8.

Por lo tanto, no hay forma de que una página, un usuario que no sea desarrollador, una metaetiqueta o la lista de compatibilidad de Microsoft pueda poner IE9 en este estado no identificable.

Bastará con usarlo if(navigator.userAgent.indexOf("Trident/5")>-1).

No se preocupe, esto no es por estilos, formato, lógica o contenido de la página. Utilizo la detección de funciones para esas cosas. Solo necesito detectar IE9 (independientemente del modo en el que esté) y tomar una decisión sobre el contenido que no sea de la página al respecto.

Gracias por orientarme hacia la respuesta con sus sugerencias y enlaces.

Dee2000
fuente
1
Nunca confíe en el agente de usuario ... puede mentir perfectamente y no hay forma de estar seguro de si dice la verdad o no ... debe probar funciones o características específicas en su lugar
JCOC611
2
@ JCOC611 Sí y no. Esta es una pregunta específica sobre cómo saber si es IE9 en la vista de compatibilidad, que es una pregunta razonable. En general, no se debe confiar en las cadenas de agentes de usuario para la funcionalidad del sitio, ya que se puede falsificar fácilmente, es cierto.
Dennis G
1
Incluso si el agente de usuario es preciso, es muy preferible utilizar la detección de funciones si es posible. Entonces, no necesita saber si IE está o no en modo de compatibilidad en primer lugar.
Dave Ward
1
Solo quiero agregar que esto es muy útil si desea proporcionar un tutorial rápido a los usuarios que están usando un modo de navegador incorrecto.
Joost
1
@ JCOC611 ¿Quién engañaría a su agente de usuario y esperaría que las cosas funcionen correctamente? ¿Debería realmente preocuparnos por ese caso?
JohnnyFaldo

Respuestas:

67

En realidad, la cadena del agente de usuario es diferente para IE9 cuando se ejecuta en modo de compatibilidad con IE7, por lo que esta sería una de las mejores formas de distinguir entre las diferentes versiones de IE.

Presentamos la cadena de agente de usuario de IE9 :

Similar a IE8, la Vista de compatibilidad de IE9 se asignará al Modo de estándares de IE7, y la cadena UA de IE9 cuando esté en Vista de compatibilidad será:

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

En la Vista de compatibilidad, IE9 se informa a sí mismo como IE7 a través del número de versión de la aplicación (Mozilla / 4.0) y el token de versión (MSIE 7.0). Esto se hace por compatibilidad. Un token Trident incrementado, de 'Trident / 4.0' a 'Trident / 5.0', permite a los sitios web distinguir entre IE9 que se ejecuta en Compat View e IE8 que se ejecuta en Compat View .

(énfasis agregado por mí). Por lo tanto, la cadena del agente de usuario es la misma que indica que es "Mozilla / 4.0" y MSIE 7.0, pero IE9 siempre será Trident / 5.0, sin importar si dice MSIE 7.0, MSIE 8.0 o MSIE 9.0.

En realidad, debería consultar esta gran compilación: Cadenas de ID del navegador (agente de usuario) o incluso mejor useragentstrings.com

Dennis G
fuente
1
Hola moontear. También vi que se supone que "Trident / 5.0" está presente cuando IE9 está en modo IE7, pero eso no es lo que veo en mi (final) IE9 en Win7 Pro x64. No muestra ningún tridente en el modo IE7 (que es lo que parece el IE7 real) y muestra el tridente 4 en el modo IE8 (nuevamente, cómo se ve el IE8 real). Estoy usando el menú desplegable de herramientas de desarrollador de IE9 para seleccionar el modo de navegador y luego en la barra de direcciones que alerta a javascript: alerta (navigator.userAgent)
Dee2000
1
"Trident / 5.0" está presente en la cadena de usuario-agente de IE9 en todos los modos.
EricLaw
Como dice EricLaw, Dee. Trident / 5.0 debe estar presente cuando usa el modo de compatibilidad (¿podría ser diferente para el modo de navegador?). ¿Cómo se comprueba la cadena del agente de usuario? Intente verificar a través de whatsmyuseragent.com e informe.
Dennis G
Vea mi respuesta a continuación (tuve que usar otra identificación Dee2001 debido a una regla de 8 horas de desbordamiento de pila sobre cómo agregar una respuesta a su propio mensaje). Sí, Eric y Moontear tienen razón, Trident / 5.0 está presente en todos los modos de IE9. Mi gran error fue cambiar el "Modo de navegador" a IE7 o IE8 en las herramientas de desarrollo, pero ese no es un "modo" que una página / metaetiqueta / lista de compatibilidad puede imponer. En su lugar, está simulando los navegadores mismos, por lo que, naturalmente, la cadena useragent es realmente como IE7 / 8.
Dee2000
1
¡Esto es perfecto! Muchas gracias. No me baso en el estilo del navegador informado, pero estoy configurando una barra de advertencia en la parte superior del sitio en el que estoy trabajando que dice que el usuario necesita actualizar (si, por ejemplo, las etiquetas condicionales dicen que es menor o igual que ie7) - No quiero que el mensaje diga actualización en este caso, sino que deshabilite el modo de compatibilidad
Chelsea Urquhart
47

document.documentMode es la mejor forma para el modo de documento.

Yuhong Bao
fuente
17
Amplíe la respuesta un poco. Más contexto.
random_user_name
3
¿Por qué la gente no está agregando esto? Es exactamente lo que se necesita
Jamie Hutber
5
De hecho, esa es la mejor manera. Puede usarlo de esta manera: <script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>. El IE7 real (!) Y todos los que no son IE devuelven 'indefinido', solo IE8 / 9 en Comp. modo retorno 7. No puedo probar IE10, pero debería ser el mismo.
Frank Conijn
2
Intenté esto en IE10 en un lado con la etiqueta META de borde; normalmente, devuelve "10". Forzar el modo de compatibilidad en todos los sitios y aún así devuelve "10".
Whelkaholism
Funciona para mí en IE10 e IE11 Preview
Simon Keep
20

IE7 no contiene ninguna información sobre Trident

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0)

IE8 contiene esta cadena: "Trident / 4.0"

User-Agent : Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0)

IE9 contiene esta cadena: "Trident / 5.0"

IE9 en modo de compatibilidad:

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0; Trident/5.0)

IE9 en modo normal:

User-Agent : Mozilla/5.0 (compatible; MSIE 9.0; Trident/5.0)
Greg
fuente
1
Eso es genial, ¿IE10 incrementa Trident también?
slotishtype
3
Internet explorer 10 users Trident / 6.0 .... ver blogs.msdn.com/b/ie/archive/2012/07/12/…
slotishtype
1
e IE11 usa Trident / 7.0
Dee2000
11

Espero que IE9 tenga alguna propiedad que exista y sea comprobable independientemente de si está en modo 7, 8 o 9.

Compruebe, por ejemplo , style.opacity , se introdujo en IE9 y está disponible independientemente del modo de compatibilidad:

<![if IE]> 
<script>
if(typeof document.documentElement.style.opacity!='undefined')
{
  //this must be at least IE9 
}
</script>
<![endif]>
Dr. Molle
fuente
1
Gracias, doctor Molle, lo intentaré e informaré.
Dee2000
Desafortunadamente, eso solo funciona para el modo de navegador (el menú desplegable de la izquierda en las herramientas de desarrollo de IE9). No funciona para el modo Documento (el menú desplegable de la derecha). Para el modo de documento, solo funciona en el modo de documento IE9. Si está en modo IE8, IE7 o Quirks, esa lógica falla.
Dee2000
7
Maldita sea, tienes razón. Encontré otra propiedad, me funciona en todos los modos: window.performance
Dr.Molle
@ Dee2000: También me funciona con DocumentMode. Es decir, SOLO si DocumentMode = "estándar de Internet Explorer 9", esta prueba tiene éxito.
Niklas Bäckman
@ Dr. Molle gracias por esto, window.performance hace el trabajo muy bien.
lewsid
3

A veces es necesario leer la cadena del agente de usuario de la variable del servidor, no del objeto del navegador javascript.

Compare las diferencias:

  • ASP clásico, IE11

    • cliente 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) "

    • ASP del servidor, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; BOIE9; ENUS; rv: 11.0) como Gecko "

  • ASP clásico, modo de compatibilidad IE11 :

    • cliente 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)) "

    • ASP del servidor, 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
fuente
0

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

Suponiendo que tiene un elemento oculto con la advertencia de compatibilidad de ID:

Javascript con 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();
});

Detección y advertencias, su primera y última línea de defensa contra el infierno de la compatibilidad.

TylerY86
fuente