Cómo detectar IE 11 con javascript en Asp.net
internet-explorer browser-detection (10)
Hola, quiero detectar el navegador, IE 8 o más será apropiado para mí. Para esto usé el siguiente código pero falla para IE 11. Por otra parte su detección es correcta.
function getInternetExplorerVersion()
{
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;
}
A continuación se muestra el enlace que también probé pero no pude lograr.
Como ya se ha indicado, no realice la detección del navegador, sino la detección de características. Sin embargo, como veo, su script es una versión anterior de un script que circula por aquí. Esta es la versión actualizada que detecta IE 11 aswel:
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;
}
Detección de características, detección de características, detección de características
<script>
if (!(''querySelector'' in document) //this should work in ie 9+
|| !(''localStorage'' in window) //ie 8+
|| !(''addEventListener'' in window) //ie 8 + (I think)
|| !(''matchMedia'' in window)) {//ie 10+
//do your redirect here
}
</script>
El mantra ''detección de características de uso'' me desconcierta. Cuando te topas con un error, ¿cómo puedes determinar qué ''característica'' es la culpable? Tomemos por ejemplo este bit de código:
$(''input[name^=qty]'').keyup(function(e) {
if (this.value.match(/[^0-9//]*/g)) {
this.value = this.value.replace(/[^0-9//]/g, '''')
}
});
Elimina caracteres no numéricos del campo de entrada a medida que el usuario escribe. Funciona en FF, Chrome y Safari. No funciona en CUALQUIER versión de IE (hasta 11, por lo menos): cualquier enlace posterior en el campo de entrada fallará.
Es mejor para ti si evitas la detección del navegador; Si lo necesita aquí es una buena explicación del equipo de MS:
En casos raros, puede ser necesario identificar de forma única la Vista previa de IE11. Usa el token de Trident
para hacerlo
Cambios en la cadena del agente de usuario
Para muchos sitios web heredados, algunas de las actualizaciones más visibles para IE11 Preview involucran la cadena de agente de usuario. Esto es lo que se informa para IE11 Preview en Windows 8.1 Preview: JavaScript
Mozilla / 5.0 (Windows NT 6.3; Trident / 7.0; rv: 11.0) como Gecko
Al igual que con las versiones anteriores de Internet Explorer, las porciones de la cadena de agente de usuario varían según el entorno. Aquí está la cadena para IE11 Preview en Windows 7: JavaScript
Mozilla / 5.0 (Windows NT 6.1; Trident / 7.0; rv: 11.0) como Gecko
Si compara estas cadenas con las reportadas por versiones anteriores de Internet Explorer, encontrará los siguientes cambios: Se han eliminado los tokens compatibles ("compatibles") y de navegador ("MSIE"). Se ha agregado el token "like Gecko" (para mantener la coherencia con otros navegadores). La versión del navegador ahora es reportada por un nuevo token de revisión ("rv"). Estos cambios ayudan a evitar que la Vista previa de IE11 se identifique (incorrectamente) como una versión anterior. En general, debe evitar detectar navegadores específicos o versiones de navegadores. Las suposiciones subyacentes a dichas pruebas tienden a generar resultados positivos falsos cuando se actualizan los navegadores. En su lugar, detecte las funciones a medida que las necesite y use la mejora progresiva para proporcionar experiencias simplificadas para los navegadores o dispositivos que no son compatibles con las funciones que necesita. En casos raros, puede ser necesario identificar de forma única la Vista previa de IE11. Usa el token de tridente para hacerlo
Enlace: msdn.microsoft.com/en-us/library/ie/bg182625(v=vs.85).aspx
Más fácil y eficiente código y detectar todas las versiones de IE / Edge:
if(navigator.appVersion.indexOf("MSIE") != -1 || navigator.appVersion.indexOf("Trident") != -1 || navigator.appVersion.indexOf("Edge") != -1){
// is IE
}
Puede detectar IE11 explícitamente con la siguiente comprobación (mediante la detección de características ):
if (Object.hasOwnProperty.call(window, "ActiveXObject") && !window.ActiveXObject) {
// is IE11
}
Explicación: todas las versiones de IE (excepto las realmente antiguas) tienen propiedad window.ActiveXObject
presente. IE11, sin embargo, oculta esta propiedad de DOM y esa propiedad ahora está indefinida. Pero la propiedad en sí está presente en el objeto, por lo que la comprobación de la presencia de la propiedad devuelve verdadero en todas las versiones de IE, pero en IE11 también devuelve falso para la segunda comprobación. Y, finalmente, se llama a hasOwnProperty
través de Object porque en IE8 (y creo que anteriormente) la window
no es una instanceof Object
y no tiene el método hasOwnProperty
.
Otro método, usando la cadena userAgent :
var ua = window.navigator.userAgent;
var versionSplit = /[///.]/i;
var versionRe = /(Version)//([/w.//]+)/i; // match for browser version
var operaRe = /(Opera|OPR)[// ]([/w.//]+)/i;
var ieRe = /(?:(MSIE) |(Trident)//.+rv:)([/w.]+)/i; // must not contain ''Opera''
var match = ua.match(operaRe) || ua.match(ieRe);
if (!match) {
return false;
}
if (Array.prototype.filter) {
match = match.filter(function(item) {
return (item != null);
});
} else {
// Hello, IE8!
for (var j = 0; j < match.length; j++) {
var matchGroup = match[j];
if (matchGroup == null || matchGroup == '''') {
match.splice(j, 1);
j--;
}
}
}
var name = match[1].replace(''Trident'', ''MSIE'').replace(''OPR'', ''Opera'');
var versionMatch = ua.match(versionRe) || match;
var version = versionMatch[2].split(versionSplit);
Esto detectará cualquier versión de IE si su cadena userAgent no fue falsificada.
Hay casos muy raros en los que realmente necesita usar la detección del navegador como se describe anteriormente. En la mayoría de los casos, el enfoque de detección de características es preferible .
Usé el siguiente código recientemente para detectar IE en general y también funcionó bien para IE 11
var bs = document.body.style, isIE=false;
if (''msTransition'' in bs) {
isIE = true;
}
La idea es buscar el prefijo vedor.
Use !(window.ActiveXObject) && "ActiveXObject" in window
para detectar IE11 explícitamente.
Para detectar cualquier versión de IE, use window.ActiveXObject || "ActiveXObject" in window
window.ActiveXObject || "ActiveXObject" in window
lugar.
¡NO HAGA LA DETECCIÓN DE NAVEGADOR! Se romperá, y te causará problemas.
IE11 tiene una cadena de agente de usuario completamente diferente a las versiones anteriores de IE; ya no incluye el texto "MSIE". Es por esto que su código de detección no funciona.
Es importante señalar aquí que la razón por la que hicieron esto fue deliberada. Querían romper los scripts de detección del navegador como este.
Es posible cambiar el código para que funcione con IE11, pero recomiendo encarecidamente que no lo haga, ya que probablemente vuelva a tener el mismo problema cuando se publique IE12.
Entonces, ¿por qué querían romper los scripts de detección del navegador? Simple: porque IE11 no tiene los errores de las versiones anteriores, y tiene muchas características nuevas. Entonces, si está haciendo la detección del navegador porque IE tiene ciertos errores o características faltantes y tiene un código para solucionar esos problemas según la detección del navegador, ese código podría causar problemas peores en IE11 donde no se necesitan las correcciones.
IE11 ha roto su script, pero la misma lógica se aplica a todos los navegadores y todas las versiones; Detectar el navegador y la versión es casi siempre algo incorrecto.
Si hay funciones específicas que desea admitir, pero que faltan en versiones anteriores de IE (u otros navegadores más antiguos), no use la detección del navegador para resolverlo; debería utilizar la detección de características en su lugar.
Detección de características significa verificar el navegador para ver si admite las características particulares que desea usar. La forma más común de hacer esto es usar la biblioteca Modernizr . Los documentos en su sitio lo guiarán a través de su configuración.
Hay algunos errores en versiones anteriores de IE que son difíciles de detectar, y para estos pocos casos, es válido usar la detección del navegador como último recurso, pero estos casos son solo para IE6 y versiones anteriores. Tal vez de vez en cuando para IE7. Pero en la pregunta, usted ha declarado que solo está mirando IE8 y versiones posteriores, por lo que no debería aplicarse.
Stick con la detección de características; es más confiable, mejor práctica, y no se romperá de repente cuando se lance una nueva versión del navegador.
isIE11 = !!window.MSStream;
if(isIE11){
/* Something */
}