problemas - JavaScript: ¿Puedo detectar IE9 si está en modo de compatibilidad IE7 o IE8?
mi pagina se ve mal en internet explorer (7)
Necesito saber si el navegador que se identifica 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.
De lo que puedo ver en la cadena de agente de usuario, un IE9 en modo de compatibilidad 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 caprichos o forzando una configuración específica.
Espero que IE9 tenga alguna propiedad que exista y que sea comprobable independientemente de si está en el modo 7, 8 o 9.
Editado para agregar ...
OK, veo dónde estaba yendo mal ahora. Estaba usando el menú desplegable "Modo navegador" y lo cambié a IE8 e IE7 y pensé que era el "modo de compatibilidad IE8" y el "modo de compatibilidad IE7", respectivamente. Por supuesto que esto no es cierto. El modo de navegador de las herramientas de desarrollador realmente lo está cambiando a "ser como" esos navegadores antiguos, por lo que es correcto que se notifiquen las cadenas de caracteres originales.
Si dejo el modo de navegador en compatibilidad con IE9 o IE9 y pruebo las variantes desplegables de modo de documento, entonces de hecho tengo presente "Trident / 5.0" en las 8 combinaciones (dos modos de navegador y 4 modos de documento). Solo necesito evitar 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 puedan poner IE9 en este estado no identificable.
Solo usar if(navigator.userAgent.indexOf("Trident/5")>-1)
será suficiente.
No se preocupe, esto no es para estilos, formato, lógica o contenido de la página. Yo uso detección de características para esas cosas. Solo necesito detectar IE9 (independientemente del modo en que se encuentre) y tomar una decisión sobre el contenido que no sea de página.
Gracias por dirigirme hacia la respuesta con sus sugerencias y enlaces.
A veces es necesario leer la cadena del agente del usuario desde la variable del servidor, no desde el objeto navegador JavaScript.
Compara las diferencias:
ASP clásico, IE11
javascript del cliente, 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) "
servidor ASP, 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 :
javascript del cliente, 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)) "
servidor ASP, 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) "
Aquí hay una tabla de todos los modos de navegador y documento para IE9 :
Desde https://.com/a/29288153/2879498
Suponiendo que tiene un elemento oculto con la ID compatibilidad-advertencia:
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 compatibilidad.
En realidad, la cadena de agente de usuario es diferente para IE9 cuando se ejecuta en modo de compatibilidad IE7, por lo que esta sería una de las mejores formas de distinguir entre las diferentes versiones de IE.
Presentamos la cadena del agente de usuario de IE9 :
De forma similar a IE8, la Vista de compatibilidad de IE9 se correlacionará con el Modo de estándares IE7, y la cadena UA de IE9 cuando se encuentre en la 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 mediante el 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 que los sitios web distingan entre IE9 ejecutándose en Vista de compatibilidad e IE8 ejecutándose en Vista de compatibilidad .
(énfasis agregado por mí). Entonces la cadena de agente de usuario es la misma que se informa siendo "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ías echarle un vistazo a esta gran compilación: Cadenas de identificación del navegador (agente de usuario) o incluso mejor useragentstrings.com
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)
document.documentMode
es la mejor manera para el modo de documento.
Espero que IE9 tenga alguna propiedad que exista y que sea comprobable independientemente de si está en el modo 7, 8 o 9.
Verifique, 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]>