info javascript internet-explorer browser browser-detection

javascript browser info



La mejor forma de verificar IE menos de 9 en JavaScript sin biblioteca (14)

¿Es necesario hacerlo en JavaScript?

De lo contrario, puede usar la sintaxis de comentario condicional específica de IE:

<!--[if lt IE 9]><h1>Using IE 8 or lower</h1><![endif]-->

¿Cuál sería su forma más rápida, la más corta (la mejor) de detectar el navegador que es IE y la versión con menos de 9 en JavaScript, sin usar jQuery ni ninguna biblioteca de complementos?


A continuación hay una mejora sobre la solución de James Padolsey:

1) No contamina la memoria (el fragmento de James crea 7 fragmentos de documentos no eliminados al detectar IE11, por ejemplo).
2) Es más rápido ya que busca un valor de DocumentMode antes de generar el marcado.
3) Es mucho más legible, especialmente para los programadores de JavaScript que comienzan.

Enlace de Gist: https://gist.github.com/julianshapiro/9098609

/* - Behavior: For IE8+, we detect the documentMode value provided by Microsoft. - Behavior: For <IE8, we inject conditional comments until we detect a match. - Results: In IE, the version is returned. In other browsers, false is returned. - Tip: To check for a range of IE versions, use if (!IE || IE < MAX_VERSION)... */ var IE = (function() { if (document.documentMode) { return document.documentMode; } else { for (var i = 7; i > 0; i--) { var div = document.createElement("div"); div.innerHTML = "<!--[if IE " + i + "]><span></span><![endif]-->"; if (div.getElementsByTagName("span").length) { return i; } } } return undefined; })();


Con los comentarios condicionales, puede crear un bloque de script que solo se ejecutará en IE menos de 9.

<!--[if lt IE 9 ]> <script> var is_ie_lt9 = true; </script> <![endif]-->

Por supuesto, podría preceder este bloque con un bloque universal que declara var is_ie_lt9=false , que esto anularía para IE menos de 9. (En ese caso, querría eliminar la declaración var , ya que sería repetitiva) .

EDITAR : Aquí hay una versión que no depende de bloques de scripts en línea (puede ejecutarse desde un archivo externo), pero no utiliza el rastreo de agente de usuario:

A través de @cowboy :

with(document.createElement("b")){id=4;while(innerHTML="<!--[if gt IE "+ ++id+"]>1<![endif]-->",innerHTML>0);var ie=id>5?+id:0}



Este enlace contiene información relevante sobre la detección de versiones de Internet Explorer:

http://tanalin.com/en/articles/ie-version-js/

Ejemplo:

if (document.all && !document.addEventListener) { alert(''IE8 or older.''); }


Me gustó la respuesta de Mike Lewis, pero el código no pasó jslint y no pude entender el funky while loop. Mi caso de uso es mostrar un mensaje de navegador no compatible si es menor o igual que IE8.

Aquí hay una versión libre de jslint basada en Mike Lewis:

/*jslint browser: true */ /*global jQuery */ (function () { "use strict"; var browserNotSupported = (function () { var div = document.createElement(''DIV''); // http://msdn.microsoft.com/en-us/library/ms537512(v=vs.85).aspx div.innerHTML = ''<!--[if lte IE 8]><I></I><![endif]-->''; return div.getElementsByTagName(''I'').length > 0; }()); if (browserNotSupported) { jQuery("html").addClass("browserNotSupported").data("browserNotSupported", browserNotSupported); } }());


Podrías hacerlo de manera rápida y sucia con una expresión regular y .match() :

if (navigator.userAgent.match(/MSIE/s(?!9.0)/)) { // ie less than version 9 }


Por lo que vale:

if( document.addEventListener ){ alert("you got IE9 or greater"); }

Esto se dirige con éxito a IE 9+ porque el método addEventListener fue compatible desde el principio para cada navegador principal, excepto IE. (Chrome, Firefox, Opera y Safari) Referencia de MDN . Actualmente está soportado en IE9 y podemos esperar que continúe siendo soportado aquí en adelante.


Si yo fuera tú, usaría la compilación condicional o la detección de características.
Aquí hay otra alternativa:

<!--[if lt IE 9]><!--> <script> var LTEIE8 = true; </script> <!--<![endif]-->


Todos están tratando de complicar cosas tan simples. Solo use un comentario condicional de JScript simple y simple. Es el más rápido porque agrega código cero a navegadores que no son de IE para la detección, y tiene compatibilidad que se remonta a versiones de IE antes de que los comentarios condicionales de HTML fueran compatibles. En breve,

var IE_version=(-1/*@cc_on,@_jscript_version@*/);

Cuidado con los minificadores: la mayoría (si no todos) confundirán el comentario condicional especial para un comentario normal y lo eliminarán

Básicamente, el código anterior establece el valor de IE_version a la versión de IE que está utilizando, o -1 f no está utilizando IE. Una demostración en vivo:

var IE_version=(-1/*@cc_on,@_jscript_version@*/); if (IE_version!==-1){ document.write("<h1>You are using Internet Explorer " + IE_version + "</h1>"); } else { document.write("<h1>You are not using a version of Internet Explorer less than 11</h1>"); }


bah a comentarios condicionales! Código condicional todo el camino! (tonto IE)

<script type="text/javascript"> /*@cc_on var IE_LT_9 = (@_jscript_version < 9); @*/ </script>

En serio, solo tirando esto por si te conviene más ... son la misma cosa, esto solo puede estar en un archivo .js en lugar de HTML en línea

Nota: es completamente una coincidencia que la verificación jscript_version sea "9" aquí. Configurarlo en 8, 7, etc. NO marcará "es IE8", necesitaría buscar las versiones de jScript para esos navegadores.



if (+(/MSIE/s(/d+)/.exec(navigator.userAgent)||0)[1] < 9) { // IE8 or less }

  • extraer la versión de IE con: /MSIE/s(/d+)/.exec(navigator.userAgent)
  • si no es un navegador IE, devolverá null así que en ese caso ||0 cambiará ese null a 0
  • [1] obtendrá la versión principal de IE o undefined si no fuera un navegador IE
  • leading + lo convertirá en un número, undefined se convertirá en NaN
  • comparar NaN con un número siempre devolverá false

var ie = !-[1,]; // true if IE less than 9

Este truco es compatible con ie5,6,7,8. Se fija en ie9 + (por lo que se ajusta a las demandas de esta pregunta). Este truco funciona en todos los modos de compatibilidad IE.

Cómo funciona : es decir, la matriz de tratamiento del motor con un elemento vacío (como este [, 1]) como una matriz con dos elementos, en cambio otros navegadores piensan que solo hay un elemento. Así que cuando convertimos este conjunto a número con + operador hacemos algo como eso: ('', 1'' en ie / ''1'' en otros) * 1 y obtenemos NaN en ie y 1 en otros. Que lo transformamos en valor booleano e inverso con! Sencillo. Por cierto, podemos usar una versión más corta sin! firmar, pero el valor será revertido.

Este es el truco más corto por ahora. Y yo soy el autor;)