the page internet change attached internet-explorer debugging internet-explorer-11 browser-detection forward-compatibility

internet explorer - page - ¿Cómo detectar IE11?



internet explorer document mode (15)

Cuando quiero detectar IE utilizo 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 está devolviendo "No estás usando Internet Explorer". ¿Cómo puedo detectarlo?


Obtener la versión de 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 " versión de espacio MSIE" o " versión de espacio-o-colon de Trident other-text rv". Sabiendo esto, tomamos el número de versión de una expresión regular String.match() . Se utiliza un bloque try-catch para acortar el código, de lo contrario tendríamos que probar los límites de la matriz para los navegadores que no son IE.

Nota: El usuario-agente 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.

Obtener la versión de 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. Así que podemos probar las características de forma descendente. Aquí se usa una secuencia ternary por brevedad, aunque las instrucciones if-then y switch funcionarán igual de bien. La variable es ie se establece en un entero 5-11, o 1 para más viejo, o 99 para más nuevo / no IE. Puede configurarlo en 0 si solo quiere probar el IE 1-11 exactamente.

Nota: la detección de objetos puede fallar 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 usuario-agente es la mejor opción.

Detectar si el navegador es moderno

Si solo está interesado en saber si un navegador es compatible o no con 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 con problemas principales. Las pruebas para window.getComputedStyle también le brindarán una buena combinación de navegadores modernos (IE 9, FF 4, Chrome 11, Safari 5, Opera 11.5). IE 9 mejora considerablemente el soporte de estándares, pero la animación nativa de CSS requiere IE 10.

var isModernBrowser = ( !document.all || ( document.all && document.addEventListener ) );


Angular JS lo 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 otros navegadores 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


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


Este parece ser un método mejor. "indexOf" devuelve -1 si no hay ninguna coincidencia. 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''; }


Estoy usando un método más simple:

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

Así que si buscas:

navigator.msMaxTouchPoints !== void 0

Encontrarás Internet Explorer 11.


Francamente, diría que utiliza una biblioteca que hace lo que necesitas (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 con expresiones regulares fallará.

Gracias a dios IE se va ...


He leído tus respuestas y he hecho 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 que si devuelvo 0, significa que no hay IE.


IE11 ya no informa como MSIE , 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 el Trident/ string en el agente de usuario si navigator.appName devuelve 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) aún está en la vista previa, y el agente de usuario puede cambiar antes del lanzamiento.


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") }


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; } } }

utilizar 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 más 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;


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

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


Use MSInputMethodContext como 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


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 "); }


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

onscroll="if (document.activeElement==this) ignoreHideOptions()"


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;