Detecta la versión de IE (anterior a v9) en JavaScript

246

Quiero enviar a los usuarios de nuestro sitio web a una página de error si están utilizando una versión Internet Exploreranterior a la v9. Simplemente no vale la pena nuestro tiempo y dinero para apoyar IE pre-v9. Los usuarios de todos los otros navegadores que no son IE están bien y no deben ser devueltos. Aquí está el código propuesto:

if(navigator.appName.indexOf("Internet Explorer")!=-1){     //yeah, he's using IE
    var badBrowser=(
        navigator.appVersion.indexOf("MSIE 9")==-1 &&   //v9 is ok
        navigator.appVersion.indexOf("MSIE 1")==-1  //v10, 11, 12, etc. is fine too
    );

    if(badBrowser){
        // navigate to error page
    }
}

¿Este código hará el truco?

Para evitar algunos comentarios que probablemente vendrán en mi camino:

  1. Sí, sé que los usuarios pueden forjar su useragentcadena. No estoy preocupado
  2. Sí, sé que los profesionales de la programación prefieren detectar el soporte de características en lugar del tipo de navegador, pero no creo que este enfoque tenga sentido en este caso. Ya sé que todos los navegadores (relevantes) que no son IE admiten las características que necesito y que no todos los pre-v9 IEnavegadores lo hacen. Verificar una característica por característica en todo el sitio sería un desperdicio.
  3. Sí, sé que alguien que intente acceder al sitio usando IE v1(o> = 20) no establecería 'badBrowser' en verdadero y la página de advertencia no se mostraría correctamente. Ese es un riesgo que estamos dispuestos a correr.
  4. Sí, sé que Microsoft tiene "comentarios condicionales" que pueden usarse para la detección precisa de la versión del navegador. IE ya no admite comentarios condicionales IE 10, lo que hace que este enfoque sea absolutamente inútil.

¿Algún otro problema obvio a tener en cuenta?

Chad Decker
fuente
122
"Simplemente no vale la pena nuestro tiempo y dinero para soportar IE pre-v9". Desearía poder hacer eso.
Hassan
2
Basado en el punto [2] no sugeriré Modernizr ( en.wikipedia.org/wiki/Modernizr ) - todos tienen que dibujar una línea en la arena en algún lugar - pero IE9 parece una línea alta
amelvin
1
Los comentarios condicionales son solo comentarios normales. Solo IE los interpreta como especiales. IE10 + ya no lo hará.
Andreas
3
Los comentarios condicionales serán tratados exactamente igual por IE 10 que los navegadores que no son IE. Son comentarios HTML válidos, por lo que se tratarán como tales. Estoy de acuerdo con Andreas y creo que los comentarios condicionales son el camino a seguir.
Tim Down
1
La documentación oficial que dice que IE10 + no admitirá comentarios condicionales: blogs.msdn.com/b/ie/archive/2011/07/06/… - Gracias a: stackoverflow.com/a/9900331/320399
blong

Respuestas:

354

Esta es mi forma preferida de hacerlo. Da el máximo control. (Nota: las declaraciones condicionales solo son compatibles con IE5 - 9.)

Primero configure sus clases ie correctamente

<!DOCTYPE html>
<!--[if lt IE 7]> <html class="lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>    <html class="lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>    <html class="lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html> <!--<![endif]-->    
<head>

Luego, puede usar CSS para hacer excepciones de estilo o, si lo requiere, puede agregar JavaScript simple:

(function ($) {
    "use strict";

    // Detecting IE
    var oldIE;
    if ($('html').is('.lt-ie7, .lt-ie8, .lt-ie9')) {
        oldIE = true;
    }

    if (oldIE) {
        // Here's your JS for IE..
    } else {
        // ..And here's the full-fat code for everyone else
    }

}(jQuery));

Gracias a Paul Irish .

Jezen Thomas
fuente
21
Dado que el OP solicitó una solución puramente JavaScript, creo que la respuesta de @Tim Down a continuación es mejor, ya que no implica cambiar el HTML existente, además de que no está usando jQuery: stackoverflow.com/a/10965203/134120
AsGoodAsItGets
Me sale un error con esto en w3 html validator:Error: Saw <!-- within a comment. Probable cause: Nested comment (not allowed). At line 5, column 21 if gt IE 8]><!--><html
abumalick
161

Devuelve la versión de IE o si no, IE devuelve falso

function isIE () {
  var myNav = navigator.userAgent.toLowerCase();
  return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
}

Ejemplo:

if (isIE () == 8) {
 // IE8 code
} else {
 // Other versions IE or not IE
}

o

if (isIE () && isIE () < 9) {
 // is IE version less than 9
} else {
 // is IE 9 and later or not IE
}

o

if (isIE()) {
 // is IE
} else {
 // Other browser
}
weroro
fuente
36
No funciona para IE11. Desde IE 11, han cambiado la cadena UA a"mozilla/5.0 (windows nt 6.3; wow64; trident/7.0; .net4.0e; .net4.0c; media center pc 6.0; .net clr 3.5.30729; .net clr 2.0.50727; .net clr 3.0.30729; rv:11.0) like gecko"
Annie
22
Tenga en cuenta que en FF "falso <9" es "verdadero". Entonces, la condición debería serif (isIE () && isIE () < 9) {
nZeus
3
¿@DeadlyChambers tal vez se estaba ejecutando en modo estándar IE7? msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
mason81
44
La respuesta aprobada es cómo detectar la versión de IE en HTML. Esto responde a la pregunta original.
Matt Wagner
2
@PrasadGayan: Microsoft Edge no es Internet Explorer. Por lo tanto, devolver falso parece ser lo correcto.
BryanGrezeszak
120

Si nadie más ha agregado un addEventListermétodo y está utilizando el modo de navegador correcto, entonces puede verificar IE 8 o menos con

if (window.attachEvent && !window.addEventListener) {
    // "bad" IE
}

Legacy Internet Explorer y attachEvent (MDN)

Andreas
fuente
77
Esta parece ser la forma más eficiente de detectar IE <= 8 completamente en JavaScript, y es ideal para personas como yo que buscaban una forma de hacerlo.
Gregory Magarshak
¡Excelente! Esto también detecta IE9 en el modo Quirks, que es lo que he estado buscando.
sstur
77
Aunque esta es una solución "fácil de usar", tiene algunos riesgos. Cualquier persona en su empresa (que no esté al tanto de su solución) puede implementar "addEventListener" o "attachEvent" para tratar la falta en IE 8. Y luego, su código dejará de funcionar.
Zé Carlos
@RoyiNamir Esto prueba para IE8. ¿Por qué debería ser verdad en IE11?
Andreas
@Andreas oops. no vi que OP quiere antes de ie9. borrando
Royi Namir
114

Utiliza comentarios condicionales. Estás intentando detectar usuarios de IE <9 y los comentarios condicionales funcionarán en esos navegadores; en otros navegadores (IE> = 10 y no IE), los comentarios serán tratados como comentarios HTML normales, que es lo que son.

HTML de ejemplo:

<!--[if lt IE 9]>
WE DON'T LIKE YOUR BROWSER
<![endif]-->

También puede hacer esto solo con script, si necesita:

var div = document.createElement("div");
div.innerHTML = "<!--[if lt IE 9]><i></i><![endif]-->";
var isIeLessThan9 = (div.getElementsByTagName("i").length == 1);
if (isIeLessThan9) {
    alert("WE DON'T LIKE YOUR BROWSER");
}
Tim Down
fuente
55
La versión de JavaScript de la respuesta de @Tim Down funcionó muy bien para mí. Usé BrowserStack para probarlo con Windows 7 e IE 8, 9, 10 y 11; Mac OS X Snow Leopard con Safari 5.1, Firefox 28.0, Chrome 33.0 y Opera 20.0; iPhone 5 Mobile Safari; y Android Samsung Galaxy Tab 2 10.1 4.0. Como se esperaba, solo IE8 informó que era IeLessThan9. ¡Agradable!
Steve Saporta
58

Para detectar MSIE (v6 - v7 - v8 - v9 - v10 - v11) fácilmente:

if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) {
   // MSIE
}
EpokK
fuente
Útil para detectar IE10, ya que no admite comentarios condicionales. No funciona en IE11, pero IE11 generalmente tiene un comportamiento correcto
personne3000
11
Finalmente, una respuesta que no da conferencias sobre el uso de la detección de características y que en realidad responde a la pregunta.
cdmckay
32

Esta es la forma en que AngularJS busca IE

/**
 * documentMode is an IE-only property
 * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
 */
var msie = document.documentMode;

if (msie < 9) {
    // code for IE < 9
}
iurii
fuente
¡Guau, esto es mucho más simple que todos los comentarios condicionales! No hay limitaciones de esto?
andrewb
Según los documentos, IE8 + admite esta propiedad, por lo que creo que debería ser suficiente para la mayoría de los casos.
iurii
Según la referencia de MSDN, "Cuando el documento actual aún no se ha determinado, documentMode devuelve un valor de cero (0). Esto generalmente ocurre cuando se carga un documento". ¿Esto significa que es posible que no obtenga una respuesta válida dentro de un script cargado en <head>?
Erik Knowles
Creo que puede solucionarlo comprobando el valor en window.onload cuando el documento ya está cargado.
iurii
19

Detección de la versión de IE mediante la detección de características (IE6 +, los navegadores anteriores a IE6 se detectan como 6, devuelve nulo para los navegadores que no son IE):

var ie = (function (){
    if (window.ActiveXObject === undefined) return null; //Not IE
    if (!window.XMLHttpRequest) return 6;
    if (!document.querySelector) return 7;
    if (!document.addEventListener) return 8;
    if (!window.atob) return 9;
    if (!document.__proto__) return 10;
    return 11;
})();

Editar: he creado un repositorio bower / npm para su conveniencia: ie-version

Actualizar:

Una versión más compacta se puede escribir en una línea como:

return window.ActiveXObject === undefined ? null : !window.XMLHttpRequest ? 6 : !document.querySelector ? 7 : !document.addEventListener ? 8 : !window.atob ? 9 : !document.__proto__ ? 10 : 11;
Gabriel Llamas
fuente
16

Esta función devolverá el número de versión principal de IE como un entero, o undefinedsi el navegador no es Internet Explorer. Esto, como todas las soluciones de agente de usuario, es susceptible a la suplantación de agente de usuario (que ha sido una característica oficial de IE desde la versión 8).

function getIEVersion() {
    var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:)(\d+)/);
    return match ? parseInt(match[1]) : undefined;
}
Owen
fuente
Owen, ¿cómo se usa eso en la práctica? ¿Cómo se recupera el valor de retorno? Lo intenté console.log(!!match && parseInt(match[1])), console.log(parseInt(match[1]))y console.log(match), pero ningún resultado con ninguno de ellos.
Frank Conijn
Obtenga el valor de retorno llamando a la función en sí getIEVersion(). Por ejemplo:if (getIEVersion() < 9) {/* IE 8 or below */} if (!getIEVersion()) {/* Not IE */}
Owen
15

Detecta IE en JS usando comentarios condicionales

// ----------------------------------------------------------
// A short snippet for detecting versions of IE in JavaScript
// without resorting to user-agent sniffing
// ----------------------------------------------------------
// If you're not in IE (or IE version is less than 5) then:
//     ie === undefined
// If you're in IE (>=5) then you can determine which version:
//     ie === 7; // IE7
// Thus, to detect IE:
//     if (ie) {}
// And to detect the version:
//     ie === 6 // IE6
//     ie > 7 // IE8, IE9 ...
//     ie < 9 // Anything less than IE9
// ----------------------------------------------------------

// UPDATE: Now using Live NodeList idea from @jdalton

var ie = (function(){

    var undef,
        v = 3,
        div = document.createElement('div'),
        all = div.getElementsByTagName('i');

    while (
        div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
        all[0]
    );

    return v > 4 ? v : undef;

}());
jKey
fuente
Eso es más o menos lo mismo que mi respuesta.
Tim Down
@TimDown: Quizás, pero esta respuesta es un poco más completa de características (te dice el número de versión) y está bien comentada. Además, el enlace al comienzo de esta respuesta conduce a un Gist con varios comentarios informativos y variaciones interesantes sobre esta técnica.
Alan
@ Alan: puntos justos. Ajusté el mío a la pregunta pero no cité la fuente.
Tim Down
12

Esto funciona para mi. Lo uso como una redirección a una página que explica por qué no nos gusta <IE9 y proporciona enlaces a los navegadores que preferimos.

<!--[if lt IE 9]>
<meta http-equiv="refresh" content="0;URL=http://google.com">
<![endif]-->
iconMatrix
fuente
1
Ohw, esa es desagradable. Utilizo un método más amigable, visualizo un div con el aspecto de una advertencia de IE y cuando el visitante hace clic en él, el usuario va a browsehappy.com
Codebeat
10

Su código puede hacer la verificación, pero como pensó, si alguien intenta acceder a su página usando IE v1 o> v19 no obtendrá el error, por lo que podría ser más seguro hacer la verificación con la expresión Regex como este código a continuación:

var userAgent = navigator.userAgent.toLowerCase();
// Test if the browser is IE and check the version number is lower than 9
if (/msie/.test(userAgent) && 
    parseFloat((userAgent.match(/.*(?:rv|ie)[\/: ](.+?)([ \);]|$)/) || [])[1]) < 9) {
  // Navigate to error page
}
Fong-Wan Chau
fuente
Esta no es una buena respuesta. La detección de UA no es confiable. Más sobre eso aquí: modernizr.com/docs
Jezen Thomas
3
@Jezen A veces, el olfateo de UA es el camino a seguir: github.com/Modernizr/Modernizr/issues/538
István Ujj-Mészáros
8

Los comentarios condicionales ya no son compatibles con IE a partir de la Versión 10, como se indica en la página de referencia de Microsoft .

var ieDetector = function() {
  var browser = { // browser object

      verIE: null,
      docModeIE: null,
      verIEtrue: null,
      verIE_ua: null

    },
    tmp;

  tmp = document.documentMode;
  try {
    document.documentMode = "";
  } catch (e) {};

  browser.isIE = typeof document.documentMode == "number" || eval("/*@cc_on!@*/!1");
  try {
    document.documentMode = tmp;
  } catch (e) {};

  // We only let IE run this code.
  if (browser.isIE) {
    browser.verIE_ua =
      (/^(?:.*?[^a-zA-Z])??(?:MSIE|rv\s*\:)\s*(\d+\.?\d*)/i).test(navigator.userAgent || "") ?
      parseFloat(RegExp.$1, 10) : null;

    var e, verTrueFloat, x,
      obj = document.createElement("div"),

      CLASSID = [
        "{45EA75A0-A269-11D1-B5BF-0000F8051515}", // Internet Explorer Help
        "{3AF36230-A269-11D1-B5BF-0000F8051515}", // Offline Browsing Pack
        "{89820200-ECBD-11CF-8B85-00AA005B4383}"
      ];

    try {
      obj.style.behavior = "url(#default#clientcaps)"
    } catch (e) {};

    for (x = 0; x < CLASSID.length; x++) {
      try {
        browser.verIEtrue = obj.getComponentVersion(CLASSID[x], "componentid").replace(/,/g, ".");
      } catch (e) {};

      if (browser.verIEtrue) break;

    };
    verTrueFloat = parseFloat(browser.verIEtrue || "0", 10);
    browser.docModeIE = document.documentMode ||
      ((/back/i).test(document.compatMode || "") ? 5 : verTrueFloat) ||
      browser.verIE_ua;
    browser.verIE = verTrueFloat || browser.docModeIE;
  };

  return {
    isIE: browser.isIE,
    Version: browser.verIE
  };

}();

document.write('isIE: ' + ieDetector.isIE + "<br />");
document.write('IE Version Number: ' + ieDetector.Version);

luego use:

if((ieDetector.isIE) && (ieDetector.Version <= 9))
{

}
Arnold.Krumins
fuente
1
Esto fue lo único que funcionó en toda la red, al menos en el montón de cosas que intenté ... gracias;
Henrique C.
Este código es bueno, pero no puede detectar el modo de vista de compatibilidad. Estoy en IE 11 usando la vista de compatibilidad en IE 8 y este código sigue dando version 11EDITAR: ¡Este código es INCREÍBLE! jaja, da un objeto con todo dentro. La versión es 11 pero docModeIR es igual a 9. ¡Gracias!
MarceloBarbosa
5

Para ie 10 y 11:

Puede usar js y agregar una clase en html para mantener el estándar de comentarios condicionales :

  var ua = navigator.userAgent,
      doc = document.documentElement;

  if ((ua.match(/MSIE 10.0/i))) {
    doc.className = doc.className + " ie10";

  } else if((ua.match(/rv:11.0/i))){
    doc.className = doc.className + " ie11";
  }

O use una lib como bowser:

https://github.com/ded/bowser

O modernizador para la detección de características:

http://modernizr.com/

Liko
fuente
2
Intenté algunos scripts y soluciones, pero nada funcionó. Luego incluí bowser en el proyecto y simplemente funcionó. Entonces uno para sugerir bowser.
Moulde
3

Para detectar Internet Explorer 10 | 11, puede usar este pequeño script inmediatamente después de la etiqueta del cuerpo:

En mi caso, uso la biblioteca jQuery cargada en la cabeza.

<!DOCTYPE HTML>
<html>
<head>
    <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
</head>
<body>
    <script>if (navigator.appVersion.indexOf('Trident/') != -1) $("body").addClass("ie10");</script>
</body>
</html>
Brian
fuente
Me gusta, gracias, solo necesito detectar 10 u 11 ya que no
soporto
IE9 también es tridente pero no es lo mismo con soporte CSS. Su detección cree que es al menos 10 pero eso no es correcto.
Codebeat
3

Esto ha sido respondido a muerte, pero esto es todo lo que necesitas.

!!navigator.userAgent.match(/msie\s[5-8]/i)
Timothy Perez
fuente
Además, aquí hay un sandbox que muestra el patrón regex contra las cadenas de agentes de usuario de IE más comunes: regex101.com/r/lC6oP3/1
Timothy Perez
@alessadro - Pero se supone que sí, ¿no? OP quería probar para <9 ...
nnnnnn
2
var Browser = new function () {
    var self = this;
    var nav = navigator.userAgent.toLowerCase();
    if (nav.indexOf('msie') != -1) {
        self.ie = {
            version: toFloat(nav.split('msie')[1])
        };
    };
};


if(Browser.ie && Browser.ie.version > 9)
{
    // do something
}
Berezh
fuente
2

Según Microsoft , la siguiente es la mejor solución, también es muy simple:

function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
    var rv = -1; // Return value assumes failure.
    if (navigator.appName == 'Microsoft Internet Explorer')
    {
        var ua = navigator.userAgent;
        var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null)
            rv = parseFloat( RegExp.$1 );
    }
    return rv;
}

function checkVersion()
{
    var msg = "You're not using Internet Explorer.";
    var ver = getInternetExplorerVersion();

    if ( ver > -1 )
    {
        if ( ver >= 8.0 ) 
            msg = "You're using a recent copy of Internet Explorer."
        else
            msg = "You should upgrade your copy of Internet Explorer.";
      }
    alert( msg );
}
AHH
fuente
De hecho, y en caso de que alguien más llegue aquí tratando de usar lo anterior, el código en una respuesta posterior funciona para IE11 ( stackoverflow.com/a/26375930/1129926 ). Pero cuidado, ¿funcionará para IE12, etc.? En resumen, es mejor considerarlos como hacks temporales y es probable que fallen más tarde a medida que se lanzan nuevas versiones de navegador (ni siquiera mencionaré Edge).
Jeff Mergler
1

Voy a recomendar no reescribir este código por enésima vez. Le recomendaría que use la biblioteca Conditionizr ( http://conditionizr.com/ ) que es capaz de probar versiones específicas de IE, así como otros navegadores, sistemas operativos e incluso la presencia o ausencia de pantallas Retina.

Incluya el código solo para las pruebas específicas que necesita y también obtendrá el beneficio de una biblioteca probada que ha pasado por muchas iteraciones (y que sería fácil de actualizar sin romper su código).

También se combina perfectamente con Modernizr, que puede manejar todos esos casos en los que es mejor probar una capacidad específica en lugar de un navegador específico.

John Munsch
fuente
1

Me gusta eso:

<script>
   function isIE () {
       var myNav = navigator.userAgent.toLowerCase();
       return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
   }    
   var ua = window.navigator.userAgent;
   //Internet Explorer | if | 9-11

   if (isIE () == 9) {
       alert("Shut down this junk! | IE 9");
   } else if (isIE () == 10){
       alert("Shut down this junk! | IE 10");
   } else if (ua.indexOf("Trident/7.0") > 0) {
       alert("Shut down this junk! | IE 11");
   }else{
       alert("Thank god it's not IE!");
   }

</script>
Julio Cesar Boaroli
fuente
1

Este enfoque para detectar IE combina las fortalezas y evita las debilidades de la respuesta de jKey usando comentarios condicionales y la respuesta de Owen usando agentes de usuario.

  • El enfoque de jKey funciona hasta la versión 9 y es inmune a la suplantación de agentes de usuario en IE 8 y 9.
  • El enfoque de Owen puede fallar en IE 5 y 6 (informe 7) y es susceptible a la suplantación de identidad de usuario, pero puede detectar versiones de IE> = 10 (ahora también incluye 12, que es posterior a la respuesta de Owen).

    // ----------------------------------------------------------
    // A short snippet for detecting versions of IE
    // ----------------------------------------------------------
    // If you're not in IE (or IE version is less than 5) then:
    //     ie === undefined
    // Thus, to detect IE:
    //     if (ie) {}
    // And to detect the version:
    //     ie === 6 // IE6
    //     ie > 7 // IE8, IE9 ...
    // ----------------------------------------------------------
    var ie = (function(){
        var v = 3,
            div = document.createElement('div'),
            all = div.getElementsByTagName('i');
    
        while (
            div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
            all[0]
        );
        if (v <= 4) { // Check for IE>9 using user agent
            var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:|Edge\/)(\d+)/);
            v = match ? parseInt(match[1]) : undefined;
        }
        return v;
    }());

Esto se puede utilizar para establecer clases útiles para su documento que contiene la versión de IE:

    if (ie) {
        document.documentElement.className += ' ie' + ie;
        if (ie < 9)
            document.documentElement.className += ' ieLT9';
    }

Tenga en cuenta que detecta el modo de compatibilidad que se está utilizando, si IE está en modo de compatibilidad. También tenga en cuenta que la versión de IE es principalmente útil para versiones anteriores (<10); las versiones superiores son más compatibles con los estándares y probablemente sea mejor verificar las características utilizando algo como modernizr.js.

jtbr
fuente
1

Hice un conveniente subrayado mixin para esto.

_.isIE();        // Any version of IE?
_.isIE(9);       // IE 9?
_.isIE([7,8,9]); // IE 7, 8 or 9?

_.mixin({
  isIE: function(mixed) {
    if (_.isUndefined(mixed)) {
      mixed = [7, 8, 9, 10, 11];
    } else if (_.isNumber(mixed)) {
      mixed = [mixed];
    }
    for (var j = 0; j < mixed.length; j++) {
      var re;
      switch (mixed[j]) {
        case 11:
          re = /Trident.*rv\:11\./g;
          break;
        case 10:
          re = /MSIE\s10\./g;
          break;
        case 9:
          re = /MSIE\s9\./g;
          break;
        case 8:
          re = /MSIE\s8\./g;
          break;
        case 7:
          re = /MSIE\s7\./g;
          break;
      }

      if (!!window.navigator.userAgent.match(re)) {
        return true;
      }
    }

    return false;
  }
});

console.log(_.isIE());
console.log(_.isIE([7, 8, 9]));
console.log(_.isIE(11));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

danrichards
fuente
1

o simplemente

//   IE 10: ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'; 
//   IE 11: ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; 
// Edge 12: ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0'; 
// Edge 13: ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'; 

var isIE = navigator.userAgent.match(/MSIE|Trident|Edge/)
var IEVersion = ((navigator.userAgent.match(/(?:MSIE |Trident.*rv:|Edge\/)(\d+(\.\d+)?)/)) || []) [1]
Giacomo
fuente
0

El script JS más completo que encontré para buscar versiones de IE es http://www.pinlady.net/PluginDetect/IE/ . Toda la biblioteca está en http://www.pinlady.net/PluginDetect/Browsers/ .

Con IE10, las declaraciones condicionales ya no son compatibles.

Con IE11, el agente de usuario ya no contiene MSIE. Además, el uso del agente de usuario no es confiable porque puede modificarse.

Usando el script PluginDetect JS, puede detectar IE y detectar las versiones exactas utilizando un código muy específico y bien diseñado que se dirige a versiones específicas de IE. Esto es muy útil cuando te importa exactamente con qué versión de navegador estás trabajando.

PresionandoSiempre
fuente
0

Me doy cuenta de que llego un poco tarde a la fiesta aquí, pero había estado buscando una forma simple de una línea para proporcionar comentarios sobre si un navegador es IE y qué versión de 10 en adelante era. No he codificado esto para la versión 11, por lo que tal vez se necesitará una pequeña enmienda para eso.

Sin embargo, este es el código, funciona como un objeto que tiene una propiedad y un método y se basa en la detección de objetos en lugar de raspar el objeto del navegador (que tiene fallas masivas ya que puede ser falsificado).

var isIE = { browser:/*@cc_on!@*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };

El uso es isIE.browseruna propiedad que devuelve un valor booleano y se basa en comentarios condicionales del métodoisIE.detectedVersion() que devuelve un número entre 5 y 10. Supongo que cualquier cosa menor que 6 y que estás en territorio serio de la vieja escuela y harás algo más robusto que un trazador de líneas y cualquier cosa mayor que 10 y estás en un territorio más nuevo. He leído algo sobre IE11 que no admite comentarios condicionales, pero no lo he investigado por completo, quizás para una fecha posterior.

De todos modos, como es, y para una línea, cubrirá los conceptos básicos del navegador IE y la detección de versiones. Está lejos de ser perfecto, pero es pequeño y se modifica fácilmente.

Solo como referencia, y si alguien tiene alguna duda sobre cómo implementar esto, entonces el siguiente condicional debería ayudar.

var isIE = { browser:/*@cc_on!@*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };

/* testing IE */

if (isIE.browser) {
  alert("This is an IE browser, with a detected version of : " + isIE.detectedVersion());
}
Ric
fuente
0

Detectar IE y sus versiones no podría ser más fácil, y todo lo que necesita es un poco de Javascript nativo / vainilla:

var uA = navigator.userAgent;
var browser = null;
var ieVersion = null;

if (uA.indexOf('MSIE 6') >= 0) {
    browser = 'IE';
    ieVersion = 6;
}
if (uA.indexOf('MSIE 7') >= 0) {
    browser = 'IE';
    ieVersion = 7;
}
if (document.documentMode) { // as of IE8
    browser = 'IE';
    ieVersion = document.documentMode;
}

Y esta es una forma de usarlo:

if (browser == 'IE' && ieVersion <= 9) 
    document.documentElement.className += ' ie9-';

.

Funciona en todas las versiones de IE, incluidas las versiones superiores en Vista / Modo de compatibilidad inferior, y documentModees propiedad de IE.

Frank Conijn
fuente
0

Si necesita elegir la versión del navegador IE, puede seguir el siguiente código. Este código funciona bien para la versión IE6 a IE11

<!DOCTYPE html>
<html>
<body>

<p>Click on Try button to check IE Browser version.</p>

<button onclick="getInternetExplorerVersion()">Try it</button>

<p id="demo"></p>

<script>
function getInternetExplorerVersion() {
   var ua = window.navigator.userAgent;
        var msie = ua.indexOf("MSIE ");
        var rv = -1;

        if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))      // If Internet Explorer, return version number
        {               
            if (isNaN(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))))) {
                //For IE 11 >
                if (navigator.appName == 'Netscape') {
                    var ua = navigator.userAgent;
                    var re = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})");
                    if (re.exec(ua) != null) {
                        rv = parseFloat(RegExp.$1);
                        alert(rv);
                    }
                }
                else {
                    alert('otherbrowser');
                }
            }
            else {
                //For < IE11
                alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
            }
            return false;
        }}
</script>

</body>
</html>
Nimesh
fuente
0

La ventana ejecuta IE10 se actualizará automáticamente a IE11 + y se estandarizará W3C

Hoy en día, no necesitamos admitir IE8-

    <!DOCTYPE html>
    <!--[if lt IE 9]><html class="ie ie8"><![endif]-->
    <!--[if IE 9]><html class="ie ie9"><![endif]-->
    <!--[if (gt IE 9)|!(IE)]><!--><html><!--<![endif]-->
    <head>
        ...
        <!--[if lt IE 8]><meta http-equiv="Refresh" content="0;url=/error-browser.html"><![endif]--
        ...
    </head>
xicooc
fuente
0
var isIE9OrBelow = function()
{
   return /MSIE\s/.test(navigator.userAgent) && parseFloat(navigator.appVersion.split("MSIE")[1]) < 10;
}
xicooc
fuente
0
if (!document.addEventListener) {
    // ie8
} else if (!window.btoa) {
    // ie9
}
// others
Bruce
fuente