Como detectar o IE11?

Quando eu quero detectar o IE, eu 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 ); } 

Mas o IE11 está retornando “Você não está usando o Internet Explorer”. Como posso detectá-lo?

O IE11 não é mais relatado como MSIE , de acordo com essa lista de alterações , é intencional evitar a detecção incorreta.

O que você pode fazer se realmente quiser saber se o IE é detectar o Trident/ string no user agent se navigator.appName retornar o Netscape , algo como (o não testado);

 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()); 

Use !(window.ActiveXObject) && "ActiveXObject" in window para detectar o IE11 explicitamente.

Para detectar qualquer versão do IE (pré-Edge, “Trident”), use "ActiveXObject" in window .

Use MSInputMethodContext como parte de uma verificação de detecção de recurso. Por exemplo:

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

Referências

  • Objeto MSInputMethodContext
  • API do editor de método de input
  • O que eu gostaria de ver no IE12: Internet Explorer 12 Lista de correções de bugs e novos resources
  • TypeScript / lib.dom.d.ts no mestre · APIs DOM do Microsoft / TypeScript IE

Eu li suas respostas e fiz uma mistura. Parece funcionar com o Windows XP (IE7 / IE8) e com o 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; } 

Claro que se eu retornar 0, não significa IE.

Obtenha a versão do IE a partir do User-Agent

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

Como funciona: A cadeia user-agent para todas as versões do IE inclui uma parte “MSIE space version ” ou “Trident other-text rv space-or-colon version “. Sabendo disso, pegamos o número da versão de uma expressão regular String.match() . Um bloco try-catch é usado para encurtar o código, caso contrário, precisaríamos testar os limites de matriz para navegadores não-IE.

Nota: O user-agent pode ser falsificado ou omitido, algumas vezes de forma não intencional se o usuário tiver configurado seu navegador para um “modo de compatibilidade”. Embora isso não pareça um grande problema na prática.


Obtenha a versão do IE sem o agente do usuário

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

Como funciona: cada versão do IE adiciona suporte a resources adicionais não encontrados em versões anteriores. Assim, podemos testar os resources de maneira descendente. Uma sequência ternária é usada aqui por brevidade, embora instruções if-then e switch funcionem da mesma forma. A variável ie é definida como um número inteiro 5-11, ou 1 para mais antigo, ou 99 para mais recente / não-IE. Você pode configurá-lo para 0 se quiser apenas testar o IE 1-11 exatamente.

Nota: A detecção de objects pode ser interrompida se seu código for executado em uma página com scripts de terceiros que adicionem polyfills para itens como document.addEventListener . Em tais situações, o user-agent é a melhor opção.


Detectar se o navegador é moderno

Se você está interessado apenas em saber se um navegador suporta ou não a maioria dos padrões HTML 5 e CSS 3, você pode supor razoavelmente que o IE 8 e inferior permaneçam como os principais aplicativos problemáticos. Testes para window.getComputedStyle também lhe darão uma boa mistura de navegadores modernos (IE 9, FF 4, Chrome 11, Safari 5, Opera 11.5). O IE 9 melhora muito o suporte a padrões, mas a animação CSS nativa requer o IE 10.

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

O Angular JS faz isso.

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

msie será número positivo se seu IE e NaN para outro navegador como chrome, firefox.

porque ?

A partir do Internet Explorer 11, a cadeia do agente do usuário mudou significativamente.

referir isto:

msdn # 1 msdn # 2

solução:

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

Estou usando um método mais simples:

O object global do navegador possui um touchpoint de propriedade, no Internet Exlorer 11 é chamado msMaxTouchPoints tho.

Então, se você procurar:

 navigator.msMaxTouchPoints !== void 0 

Você encontrará o Internet Explorer 11.

 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; 

Tente isto:

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

Este parece ser um método melhor. “indexOf” retorna -1 se nada for correspondido. Ele não sobrescreve as classs existentes no corpo, apenas as adiciona.

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

Detectar a maioria dos navegadores com isso:

 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

Eu usei o evento onscroll no elemento com a barra de rolagem. Quando acionado no IE, adicionei a seguinte validação:

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

Apenas para o 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 (ie);

Teste:

 var browserVersionExplorer = (function() { var ie = 'NotIE', me = 'NotIE'; 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); 

Francamente eu diria que use uma biblioteca que faça o que você precisa (como platform.js por exemplo). Em algum momento, as coisas mudarão e a biblioteca será equipada para essas mudanças, e a análise manual usando expressões regulares falhará.

Graças a Deus, o IE vai embora …