2010-08-31 23 views
8

He escrito una aplicación web que requiere IE versión 8 (o superior, presumiblemente). Si ejecuto IE8 en una instalación limpia de Windows en una VM, informa 'MSIE 8.0' como agente de usuario cuando se consulta con navigator.userAgent en javascript. Pero en una máquina de compañeros de Windows 7, su IE informa la versión 8 en la ventana Ayuda | Acerca de, pero la cadena de agente de usuario es 'MSIE 7.0'.Detección de IE8 de manera confiable usando Javascript

Me imagino que en algún lugar de su máquina hay una configuración que le dice a IE que haga una parodia de la versión anterior, supongo que es una especie de compatibilidad, pero por mi vida no puedo encontrarla. No estoy configurando el modo de movilidad de quirksmode o IE7 de mi parte.

+5

lo que realmente necesita para comprobar la versión del navegador? o puede simplemente usar detección de características? porque yo [improperio] odio la detección del navegador. – geowa4

+0

@ geowa4 - Soy un fanático de la forma de censura asterisco. :) – ChaosPandion

+1

@ ChaosPandion, sí, bueno [improperio] usted! :-P – geowa4

Respuesta

12
<meta http-equiv="X-UA-Compatible" content="IE=8"> 
<script type="text/javascript"> 
var is_ie8_or_newer = false; 
</script> 
<!--[if gte IE 8]> 
<script type="text/javascript"> 
is_ie8_or_newer = true; 
</script> 
<![endif]--> 
+0

No detectará la falsificación de Opera por desgracia ... – Rushyo

+0

No estoy seguro de si eso funciona para un navegador que se ejecuta en modo compatibilidad. lo has probado? – geowa4

+0

@Rushyo: Creo que es justo lo que quieres: Opera presentándose como IE sigue siendo Opera y actúa como Opera. –

7

El agente de usuario no es una forma sensata o confiable de determinar la versión del navegador. ¿Por qué no busca la presencia de la función que necesita convirtiéndola en IE8 solamente y la usa? Ese es un método mucho más confiable.

+22

Lo he escuchado un millón de veces y es cierto cuando se trata de una función en particular.Pero cuando es un capricho no relacionado con una característica específica con la que todavía tiene que lidiar, es útil contar con estrategias que no impliquen detectar algo completamente ajeno a lo que está haciendo. – glortho

0

http://www.modernizr.com/

Se debe detectar este tipo de problemas. Alternativamente, no estoy seguro, pero IE 8 podría cambiar su etiqueta de User-Agent en 'Modo de compatibilidad'.

+0

UA sniffing es incluso peor que la detección de versión en JS; consulte la UA de Chrome para conocer la locura: 'User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, como Gecko) Chrome/5.0.342.9 Safari/533.2' (algunos scripts de braindead están buscando "Gecko" en el script, porque eso es lo que Firefox tiene, y no me inicies en el "Mozilla" inicial) – Piskvor

+0

Modernizr detecta * características * , no errores, incompatibilidad o versiones de navegador –

+0

@Yi Jiang: ah bien, debo haber entendido mal. Estaba reaccionando a la parte sobre User-agent. – Piskvor

2

¿Podría usar comentarios condicionales?

<script> 
    var is_ie8 = false; 
</script> 
<!--[if IE 8]> 
    <script> 
    is_ie8 = true; 
    </script> 
<![endif]--> 
4

El truco más divertida que he visto — sin tener idea de qué tan eficiente es — es aprovechar la IE comentarios condicionales función dinámicamente. Para hacer eso, su código toma un oculto <div> o una <div> en un fragmento de documento, o lo que sea, y se inserta en él algo de HTML rodeado de un comentario condicional codificado para comprobar si hay una versión específica del navegador:

var dummy = document.getElementById('dummy'); 
dummy.innerHTML = '<!' + '--[if IE 8]>x<![endif]-->'; 
var isIE8 = dummy.innerHTML === 'x'; 

IE8 puede mostrar un pequeño botón al lado del cuadro de URL que cambia el navegador entre el modo IE7 y el modo IE8. Puede abrir las "Herramientas de desarrollador" y eso le dirá cuál es la configuración actual.

+1

Eso es muy parecido a http://gist.github.com/527683, http://gist.github.com/542301 y http: //gist.github .com/548648 –

+1

sí, no lo inventé; No soy lo suficientemente inteligente para eso :-) – Pointy

0

Resulta que su navegador fue configurado para mostrar todos los 'sitios de intranet' en modo de compatibilidad. Además, sí, el modo de compatibilidad cambia la cadena del agente de usuario.

0

Encontrado esta función dulce en GIT (in the comments):

function getIEVersion() 
{  
    var v = 3, div = document.createElement('div'), a = div.all || []; 
    while (div.innerHTML = '<!--[if gt IE '+(++v)+']><br><![endif]-->', a[0]); 
    return v > 4 ? v : !v;  
}; 
Cuestiones relacionadas