¿Cómo detectar IE11?

212

Cuando quiero detectar IE, uso este código:

function getInternetExplorerVersion()
{
  var rv = -1;
  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 )
  {
    msg = "You are using IE " + ver;
  }
  alert( msg );
}

Pero IE11 regresa "No estás usando Internet Explorer". ¿Cómo puedo detectarlo?

Paul Sweatte
fuente
2
Consulte también stackoverflow.com/questions/17447373/…
dave1010
1
Cualquier cosa basada en el agente de usuario es defectuosa. Es muy fácil suplantar. Ahora, puede ser que esto no sea un problema, pero me parece que un script de detección del navegador debería tener una buena posibilidad de detectar el enmascaramiento. Utilizo una combinación de comentarios condicionales, fall-through para tratar de forzar el document.documentMode y luego miro window.MSInputMethodContext según Paul Sweatte a continuación. Publicaría mi código pero está azotando a un caballo muerto.
David G
3
IE11 tiene un agente de usuario: Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; rv: 11.0) como los tipos Gecko Os: 6.1 - win7, 6.3 - win81
razor
1
mira mi respuesta aquí stackoverflow.com/questions/21825157/…
Royi Namir
1
Esta es la mejor solución que he encontrado: stackoverflow.com/a/20201867/2047385 if (Object.hasOwnProperty.call (window, "ActiveXObject") &&! window.ActiveXObject) {// is IE11}
xorcus

Respuestas:

221

IE11 ya no informa MSIE, ya que , de acuerdo con esta lista de cambios , es intencional evitar la detección errónea.

Lo que puede hacer si realmente quiere saber que es IE es detectar la Trident/cadena en el agente de usuario si navigator.appNameregresa Netscape, algo así como (el no probado);

function getInternetExplorerVersion()
{
  var rv = -1;
  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 );
  }
  else 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 );
  }
  return rv;
}

console.log('IE version:', getInternetExplorerVersion());

Tenga en cuenta que IE11 (afaik) todavía está en la vista previa, y el agente de usuario puede cambiar antes del lanzamiento.

Joachim Isaksson
fuente
81
it's intentional to avoid mis-detection- Lamentablemente, ahora que se lanzó IE11, tenemos un código que está roto solo en IE11, mientras que una detección correcta de IE habría funcionado ...
Izkata
68
function isIE() { return ((navigator.appName == 'Microsoft Internet Explorer') || ((navigator.appName == 'Netscape') && (new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})").exec(navigator.userAgent) != null))); }
Convertí
66
@lzkata: según la especificación html5 aquí , IE sigue el estándar. Entonces sí, es intencional, pero está de acuerdo con el nuevo estándar (menospreciando la antigua API html.)
Mark Avenius
11
"La razón por la que hicieron esto fue deliberada. Querían romper los scripts de detección del navegador como este". de stackoverflow.com/a/18872067/1066234 ... En realidad debería ser: "Querían hacer que miles de millones de sitios web se rompieran así".
Kai Noack
15
Esto funciona para mí: var isIE11 = !!navigator.userAgent.match(/Trident\/7\./); fuente
Kai Noack
86

Use !(window.ActiveXObject) && "ActiveXObject" in windowpara detectar IE11 explícitamente.

Para detectar cualquier versión de IE (pre-Edge, "Trident"), use "ActiveXObject" in windowen su lugar.

mcw
fuente
2
Este artículo de Microsoft sugiere que esta solución ya no funciona msdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx
Alan
55
En realidad, este artículo describe la razón por la que funciona mi método. Intentar acceder window.ActiveXObject, como se describe en el artículo, regresa undefinedahora en IE11 (así como en los navegadores que no son de Microsoft). La prueba que usa el inoperador javascript regresa trueen todos los navegadores de Microsoft, por lo que ambos son estrictamente el caso en IE11. Si Microsoft emite un cambio en el comportamiento del inoperador, sí, este método se interrumpirá.
mcw
55
"ActiveXObject" en la ventana devuelve False in Edge.
Neo
8
@Neo Edge no es IE, la pregunta del OP fue cómo detectar IE11
mastazi
1
@mastazi sí, pero en esta respuesta, se menciona que ActiveXObject se puede usar para detectar cualquier versión de IE. Aunque es discutible que Edge se llame una versión de IE o no (Microsoft seguramente no quiere llamarla una), pero para muchos de los desarrolladores, IE se ha convertido en el sinónimo de cualquier navegador predeterminado de Microsoft.
Neo
45

Úselo MSInputMethodContextcomo parte de una verificación de detección de características. Por ejemplo:

//Appends true for IE11, false otherwise
window.location.hash = !!window.MSInputMethodContext && !!document.documentMode;

Referencias

Paul Sweatte
fuente
2
Esto me parece más robusto. Ciertamente, cualquier cosa basada en el agente de usuario es bastante inútil.
David G
1
Eso funcionó en lugar de ActiveXObject. Muchas gracias
Tarık Özgün Güner
1
@tdakhla Actualizado para filtrar IE Edge.
Paul Sweatte
Es importante tener en cuenta que cualquiera de estas respuestas que pueda parecer que no funcionan es verificar la configuración de Emulación, iba a marcar esta respuesta como incorrecta pero luego verifiqué la emulación y vi que algunas configuraciones de compatibilidad de intranet anulaban el modo de visualización , una vez que se sacó de la ecuación, esta solución funcionó bien para mí.
Shaun
1
Recién confirmado #falseen no IE, IE8,9,10, Edge 14,15. #truesolo en IE11. No se realizó la prueba con el modo de documento activo. Probado con Browserstack.
danjah
15

He leído tus respuestas e hice una mezcla. Parece funcionar con Windows XP (IE7 / IE8) y Windows 7 (IE9 / IE10 / IE11).

function ie_ver(){  
    var iev=0;
    var ieold = (/MSIE (\d+\.\d+);/.test(navigator.userAgent));
    var trident = !!navigator.userAgent.match(/Trident\/7.0/);
    var rv=navigator.userAgent.indexOf("rv:11.0");

    if (ieold) iev=new Number(RegExp.$1);
    if (navigator.appVersion.indexOf("MSIE 10") != -1) iev=10;
    if (trident&&rv!=-1) iev=11;

    return iev;         
}

Por supuesto, si devuelvo 0, significa que no hay IE.

Fabio
fuente
12

Obtenga la versión IE del User-Agent

var ie = 0;
try { ie = navigator.userAgent.match( /(MSIE |Trident.*rv[ :])([0-9]+)/ )[ 2 ]; }
catch(e){}

Cómo funciona: La cadena de agente de usuario para todas las versiones de IE incluye una parte "MSIE espacio de la versión " o "Trident otro texto rv espacio-o-de colon versión ". Sabiendo esto, tomamos el número de versión de una String.match()expresión regular. Se try-catchusa un bloque para acortar el código; de lo contrario, tendríamos que probar los límites de la matriz para navegadores que no sean IE.

Nota: El agente de usuario puede ser falsificado u omitido, a veces sin querer si el usuario ha configurado su navegador en un "modo de compatibilidad". Aunque esto no parece ser un gran problema en la práctica.


Obtenga la versión IE sin el agente de usuario

var d = document, w = window;
var ie = ( !!w.MSInputMethodContext ? 11 : !d.all ? 99 : w.atob ? 10 : 
d.addEventListener ? 9 : d.querySelector ? 8 : w.XMLHttpRequest ? 7 : 
d.compatMode ? 6 : w.attachEvent ? 5 : 1 );

Cómo funciona: cada versión de IE agrega soporte para características adicionales que no se encuentran en versiones anteriores. Entonces podemos probar las características de arriba hacia abajo. Sin embargo, aquí se usa una secuencia ternaria por brevedad, if-theny las switchdeclaraciones funcionarían igual de bien. La variable iese establece en un número entero 5-11, o 1 para más antiguo, o 99 para más reciente / no IE. Puede establecerlo en 0 si solo desea probar IE 1-11 exactamente.

Nota: La detección de objetos puede romperse si su código se ejecuta en una página con scripts de terceros que agregan polyfills para cosas como document.addEventListener. En tales situaciones, el agente de usuario es la mejor opción.


Detecta si el navegador es moderno

Si solo le interesa saber si un navegador admite o no la mayoría de los estándares HTML 5 y CSS 3, puede suponer razonablemente que IE 8 y versiones inferiores siguen siendo las aplicaciones problemáticas principales. Prueba parawindow.getComputedStyle le proporcionarán una combinación bastante buena de navegadores modernos (IE 9, FF 4, Chrome 11, Safari 5, Opera 11.5). IE 9 mejora enormemente el soporte de estándares, pero la animación CSS nativa requiere IE 10.

var isModernBrowser = ( !document.all || ( document.all && document.addEventListener ) ); 
Beejor
fuente
¡La 'Obtener versión IE del Agente de usuario' funciona muy bien! solo para estar seguro, ¿esto mostrará todas las versiones, incluido IE11?
omer
1
@omer Sí, porque busca la cadena "MSIE" o "Trident"; este último es usado por IE 11 y superior. Por lo tanto, funcionará para todas las futuras versiones de IE hasta que MS cambie el nombre de su motor de navegador. Creo que el nuevo navegador Edge todavía usa Trident.
Beejor
Esto funciona muy bien, gracias @Beejor! Implementé una simple redirección a otra página usando su respuesta: var ie = 0; try { ie = navigator.userAgent.match( /(MSIE |Trident.*rv[ :])([0-9]+)/ )[ 2 ]; } catch(e){} if (ie !== 0) { location.href = "../ie-redirect/redirect.html"; }
BernardV
@BernardV ¡Se ve bien! Un consejo rápido: si tiene acceso al servidor, la detección del agente de usuario en un script puede funcionar mejor, ya que el usuario no notaría ningún redireccionamiento / parpadeo, menos solicitudes HTTP, etc. Pero en un apuro hacerlo con JS también funciona.
Beejor
9

Angular JS hace de esta manera.

msie = parseInt((/msie (\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);
if (isNaN(msie)) {
  msie = parseInt((/trident\/.*; rv:(\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);
}

msie será un número positivo si es IE y NaN para otro navegador como Chrome, Firefox.

por qué ?

A partir de Internet Explorer 11, la cadena de agente de usuario ha cambiado significativamente.

refiera esto:

msdn # 1 msdn # 2

Vishal Sharma
fuente
7

solución:

function GetIEVersion() {
  var sAgent = window.navigator.userAgent;
  var Idx = sAgent.indexOf("MSIE");
  // If IE, return version number.
  if (Idx > 0)
    return parseInt(sAgent.substring(Idx+ 5, sAgent.indexOf(".", Idx)));

  // If IE 11 then look for Updated user agent string.
  else if (!!navigator.userAgent.match(/Trident\/7\./))
    return 11;

  else
    return 0; //It is not IE

}
if ((GetIEVersion() > 0) || (navigator.userAgent.toLowerCase().indexOf('firefox') > -1)){
  alert("This is IE " + GetIEVersion());
}else {
  alert("This no is IE ");
}		

coperniko
fuente
1
Mi favorito: cuentas para IE6-10 e IE11. También agregué un cheque para edge
AlbatrossCafe
Esto detecta Firefox comoThis is IE 0
KSPR
3

Estoy usando un método más simple:

El objeto global del navegador tiene puntos de contacto de propiedad, en Internet Exlorer 11 se llama msMaxTouchPoints aunque.

Entonces, si buscas:

navigator.msMaxTouchPoints !== void 0 

Encontrará Internet Explorer 11.

Dvid Silva
fuente
1
También devuelve trun en IE 10 (Win 7)
Programador químico
2
var ua = navigator.userAgent.toString().toLowerCase();
var match = /(trident)(?:.*rv:([\w.]+))?/.exec(ua) ||/(msie) ([\w.]+)/.exec(ua)||['',null,-1];
var rv = match[2];
return rv;
Areschen
fuente
Si está utilizando una expresión regular para chec, puede agregar el indicador i para que no distinga entre mayúsculas y minúsculas, en lugar de .toLowerCase (). Tampoco hay necesidad del método .toString ().
Jake Rowsell
2

Prueba esto:

var trident = !!navigator.userAgent.match(/Trident\/7.0/);
var net = !!navigator.userAgent.match(/.NET4.0E/);
var IE11 = trident && net
var IEold = ( navigator.userAgent.match(/MSIE/i) ? true : false );
if(IE11 || IEold){
alert("IE")
}else{
alert("Other")
}
Krunal
fuente
Código incorrecto porque el navegador Acoo usa "MSIE" en el agente de uso. Mire useragentstring.com/pages/Acoo%20Browser
Usuario
ARGUMENTO INCORRECTO He probado en todos los navegadores IE, incluso en dispositivos Win8.
Krunal
Usted probó el navegador IE11 pero no el navegador Acoo y el navegador Acoo usa "MSIE" en el agente de uso como dije, así que IEold también detecta el navegador Acoo como IEold (la versión anterior de IE) y estoy seguro de que el navegador Acoo usa " MSIE "en useragent porque hice navigator.userAgent en un sitio de prueba de JavaScript con el navegador Acoo (sitio de prueba: w3schools.com )
Usuario
¿Puedes dar una mejor solución para esto?
Krunal
U puede usarlo, !navigator.userAgent.match("Acoo Browser;") && navigator.userAgent.match(/MSIE/i) ? true : falsepero eso no siempre funciona porque el navegador acoo no siempre tiene "Acoo Browser"; en su agente de uso, pero en realidad no necesita preocuparse de que el explorador acústico tenga "MSIE" en su agente de uso porque el explorador acústico es casi el mismo.
Usuario
1

Este parece ser un mejor método. "indexOf" devuelve -1 si nada coincide. No sobrescribe las clases existentes en el cuerpo, solo las agrega.

// add a class on the body ie IE 10/11
var uA = navigator.userAgent;
if(uA.indexOf('Trident') != -1 && uA.indexOf('rv:11') != -1){
    document.body.className = document.body.className+' ie11';
}
if(uA.indexOf('Trident') != -1 && uA.indexOf('MSIE 10.0') != -1){
    document.body.className = document.body.className+' ie10';
}
joe
fuente
0

Detecta la mayoría de los navegadores con esto:

var getBrowser = function(){
  var navigatorObj = navigator.appName,
      userAgentObj = navigator.userAgent,
      matchVersion;
  var match = userAgentObj.match(/(opera|chrome|safari|firefox|msie|trident)\/?\s*(\.?\d+(\.\d+)*)/i);
  if( match && (matchVersion = userAgentObj.match(/version\/([\.\d]+)/i)) !== null) match[2] = matchVersion[1];
  //mobile
  if (navigator.userAgent.match(/iPhone|Android|webOS|iPad/i)) {
    return match ? [match[1], match[2], mobile] : [navigatorObj, navigator.appVersion, mobile];
  }
  // web browser
  return match ? [match[1], match[2]] : [navigatorObj, navigator.appVersion, '-?'];
};

https://gist.github.com/earlonrails/5266945

Earlrails
fuente
0

Usé el onscrollevento en el elemento con la barra de desplazamiento. Cuando se activó en IE, agregué la siguiente validación:

onscroll="if (document.activeElement==this) ignoreHideOptions()"
Martín
fuente
0

Solo para el navegador IE:

var ie = 'NotIE'; //IE5-11, Edge+
    if( !!document.compatMode ) {
        if( !("ActiveXObject" in window) ) ) ie = 'EDGE';
        if( !!document.uniqueID){
            if('ActiveXObject' in window && !window.createPopup ){ ie = 11; }
            else if(!!document.all){
                    if(!!window.atob){ie = 10;}
                    else if(!!document.addEventListener) {ie = 9;}
                    else if(!!document.querySelector){ie = 8;}
                    else if(!!window.XMLHttpRequest){ie = 7;}
                    else if(!!document.compatMode){ie = 6;}
                    else ie = 5;
                }
        }
    }

usar alerta (es decir);

Pruebas:

var browserVersionExplorer = (function() {
    var ie = '<s>NotIE</s>',
        me = '<s>NotIE</s>';

    if (/msie\s|trident\/|edge\//i.test(window.navigator.userAgent) && !!(document.documentMode || document.uniqueID || window.ActiveXObject || window.MSInputMethodContext)) {
            if (!!window.MSInputMethodContext) {
                ie = !("ActiveXObject" in window) ? 'EDGE' : 11;
            } else if (!!document.uniqueID) {
                if (!!(window.ActiveXObject && document.all)) {
                    if (document.compatMode == "CSS1Compat" && !!window.DOMParser ) {
                        ie = !!window.XMLHttpRequest ? 7 : 6;
                    } else {
                        ie = !!(window.createPopup && document.getElementById) ? parseFloat('5.5') : 5;
                    }
                    if (!!document.documentMode && !!document.querySelector ) {
                        ie = !!(window.atob && window.matchMedia) ? 10 : ( !!document.addEventListener ? 9 : 8);
                    }
                } else ie = !!document.all ? 4 : (!!window.navigator ? 3 : 2);
            }
        }
        
    return ie > 1 ? 'IE ' + ie : ie;
})();

 alert(browserVersionExplorer);

Actualización 01 jun 2017

Ahora podríamos usar algo más fácil y simple:

var uA = window.navigator.userAgent,
    onlyIEorEdge = /msie\s|trident\/|edge\//i.test(uA) && !!( document.uniqueID || window.MSInputMethodContext),
    checkVersion = (onlyIEorEdge && +(/(edge\/|rv:|msie\s)([\d.]+)/i.exec(uA)[2])) || NaN;
James Peter
fuente
¿Dónde puedo encontrar los nuevos objetos globales estándar agregados a las nuevas versiones de Edge? Supongo que Math.acosh es uno de esos.
j4v1
1
@ j4v1 Math.acosh solo es compatible con Microsoft Edge (navegador Edge). Ref: msdn.microsoft.com/en-us/en-en/library/dn858239(v=vs.94).aspx
James Peter
Este método dejó de funcionar para mí. En el pasado detectó correctamente IE11, pero ahora que tengo Internet Explorer versión 11.1198.14393.0 (versión de actualización 11.0.42 (KB4018271)) ejecutándose en Windows 10 Enterprise (versión 1607, compilación del sistema operativo 14393.1198) Math parece admitir el método acosh.
Jueves
@Thijs En Windows 10 Education con IE11 v 11.1198.14393.0 Probé con éxito. Debe probar otra función matemática de acuerdo con ES6.
James Peter
@JamesPeter He aterrizado al comprobar document.documentMode. Esta parece ser una propiedad más confiable para verificar IE11 o Edge. documentMode existe en IE11 pero ya no existe en Edge.
Thijs
0

Francamente, diría que use una biblioteca que haga lo que necesita (como platform.js, por ejemplo). En algún momento las cosas cambiarán y la biblioteca estará equipada para esos cambios y el análisis manual utilizando expresiones regulares fallará.

Gracias a Dios IE se va ...

Matthias Hryniszak
fuente