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:
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, ''-?''];
};
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);
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;