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.
Respuestas:
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 :
(é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
fuente
document.documentMode
es la mejor forma para el modo de documento.fuente
<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.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)
fuente
Aquí hay una tabla de todos los modos de navegador y documento para IE9 :
fuente
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]>
fuente
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) "
fuente
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.
fuente