Como detectar o IE11?

212

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?

Paul Sweatte
fonte
1
Qualquer coisa com base no agente do usuário é falha. É muito fácil falsificar. Agora, isso pode não ser um problema, mas me parece que um script de detecção de navegador deve ter uma boa chance de detectar mascarados. Uso uma combinação de comentários condicionais, passo a passo para tentar coagir o document.documentMode e depois olho para window.MSInputMethodContext conforme Paul Sweatte abaixo. Eu postaria meu código, mas está açoitando um cavalo morto.
David G
3
IE11 tem facilidade de agente: Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; rv: 11,0) como tipos gecko SO: 6,1 - win7, 6,3 - win81
navalha
1
veja minha resposta aqui stackoverflow.com/questions/21825157/…
Royi Namir 19/01/15
1
aqui está a melhor solução que encontrei: stackoverflow.com/a/20201867/2047385 if (Object.hasOwnProperty.call (window, "ActiveXObject") &&! window.ActiveXObject) {// is IE11}
xorcus

Respostas:

221

O IE11 não reporta mais MSIE, pois , de acordo com esta lista de alterações , é intencional evitar a detecção incorreta.

O que você pode fazer se realmente deseja saber que é o IE é detectar a Trident/sequência no agente do usuário se navigator.appNameretornar 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());

Observe que o IE11 (afaik) ainda está em pré-visualização e o agente do usuário pode mudar antes do lançamento.

Joachim Isaksson
fonte
81
it's intentional to avoid mis-detection- Infelizmente, agora que IE11 é liberado, temos o código que está quebrado na única IE11, enquanto que uma detecção correta do IE teria funcionado ...
Izkata
68
Eu converti esta solução para um booleano se a versão é menos importantefunction isIE() { return ((navigator.appName == 'Microsoft Internet Explorer') || ((navigator.appName == 'Netscape') && (new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})").exec(navigator.userAgent) != null))); }
rg89
6
@lzkata - De acordo com a especificação html5 aqui , o IE está realmente seguindo o padrão. Então, sim, é intencional, mas é por um novo padrão (depreciativo o velho api html.)
Mark Avenius
11
"a razão pela qual eles fizeram isso foi deliberada. Eles queriam quebrar scripts de detecção de navegador como este". de stackoverflow.com/a/18872067/1066234 ... Na verdade, deveria ser: 'Eles queriam que bilhões de sites quebrassem assim.'
Kai Noack #
15
Isso funciona para mim: var isIE11 = !!navigator.userAgent.match(/Trident\/7\./); fonte
Kai Noack '
86

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

Para detectar qualquer versão do IE (pré-Edge, "Trident"), use em seu "ActiveXObject" in windowlugar.

mcw
fonte
2
Este artigo da Microsoft sugere que esta solução pode não funcionar mais msdn.microsoft.com/en-us/library/ie/dn423948(v=vs.85).aspx
Alan
5
Na verdade, este artigo descreve o motivo pelo qual meu método funciona. A tentativa de acessar window.ActiveXObject, conforme descrito no artigo, retorna undefinedagora no IE11 (assim como nos navegadores que não são da Microsoft). O teste usando o inoperador javascript retorna trueem todos os navegadores da Microsoft; portanto, ambos são estritamente no IE11. Se a Microsoft emitir uma alteração no comportamento do inoperador, sim, esse método será interrompido.
Mcw
5
"ActiveXObject" na janela retorna False no Edge.
Neo
8
@Neo Borda não é IE, a pergunta do OP foi como detectar IE11
mastazi
1
@mastazi sim, mas nesta resposta, é mencionado que o ActiveXObject pode ser usado para detectar qualquer versão do IE. Embora seja discutível que o Edge deva ser chamado de versão do IE ou não (a Microsoft certamente não quer chamá-lo de uma), mas para muitos dos desenvolvedores, o IE se tornou sinônimo de qualquer navegador padrão da Microsoft.
Neo
45

Use MSInputMethodContextcomo 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

Paul Sweatte
fonte
2
Isso me parece mais robusto. Certamente qualquer coisa baseada no agente do usuário é bastante inútil.
David G
1
Isso funcionou em vez do ActiveXObject. Muito obrigado
Tarık Özgün Güner
1
@tdakhla Atualizado para filtrar o IE Edge.
Paul Sweatte
É importante observar que, para qualquer uma dessas respostas que possa parecer que não está funcionando, verifique as configurações de Emulação. Eu marcaria essa resposta como incorreta, mas verifiquei a emulação e vi que algumas configurações de compatibilidade da intranet estavam substituindo o modo de exibição , uma vez tirada da equação, essa solução funcionou bem para mim.
Shaun
1
Apenas confirmado #falseem não-IE, IE8,9,10, Edge 14,15. #truesomente no IE11. Não testou com o modo de documento ativo. Testado com o Browserstack.
Danjah 22/17/17
15

Eu li suas respostas e fiz uma mistura. Parece funcionar com o Windows XP (IE7 / IE8) e 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, significa que não há IE.

Fabio
fonte
12

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

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

Como funciona: a sequência de agente do usuário para todas as versões do IE inclui uma parte " versão do espaço MSIE " ou " versão com espaço ou dois pontos do cólon do outro texto rv do Trident ". Sabendo disso, pegamos o número da versão em uma String.match()expressão regular. Um try-catchbloco é usado para reduzir o código; caso contrário, precisaríamos testar os limites do array para navegadores que não sejam o IE.

Nota: O agente do usuário pode ser falsificado ou omitido, às vezes sem intenção, se o usuário configurou o navegador para um "modo de compatibilidade". Embora isso não pareça muito 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 para recursos adicionais não encontrados nas versões anteriores. Assim, podemos testar os recursos de maneira descendente. A ternário seqüência é usado aqui por brevidade, embora if-thene switchdeclarações iria funcionar tão bem. A variável ieé definida como um número inteiro de 5 a 11, ou 1 para mais antigo ou 99 para mais novo / não IE. Você pode configurá-lo como 0 se quiser apenas testar o IE 1-11 exatamente.

Nota: A detecção de objetos pode ser interrompida se o seu código for executado em uma página com scripts de terceiros que adicionam polyfills para coisas como document.addEventListener. Em tais situações, o agente do usuário é a melhor opção.


Detectar se o navegador é moderno

Se você estiver interessado apenas em saber se um navegador suporta ou não a maioria dos padrões HTML 5 e CSS 3, você pode razoavelmente supor que o IE 8 e inferiores permanecem os principais aplicativos problemáticos. O teste window.getComputedStyletambém fornecerá uma combinação bastante boa de navegadores modernos (IE 9, FF 4, Chrome 11, Safari 5, Opera 11.5). O IE 9 aprimora muito o suporte a padrões, mas a animação CSS nativa requer o IE 10.

var isModernBrowser = ( !document.all || ( document.all && document.addEventListener ) ); 
Beejor
fonte
o 'Get IE Version from User-Agent' funciona muito bem! só para ter certeza, isso mostrará todas as versões, incluindo o IE11?
261 omer
1
@omer Sim, porque procura a string "MSIE" ou "Trident"; o último é usado pelo IE 11 e acima. Portanto, ele funcionará para todas as versões futuras do IE até que a MS altere o nome do mecanismo do navegador. Acredito que o novo navegador Edge ainda use o Trident.
Beejor
Isso funciona muito bem, obrigado @Beejor! Implementei um simples redirecionamento para outra página usando a sua resposta: 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 Parece bom! Uma dica rápida: se você tiver acesso ao servidor, a detecção do agente do usuário em um script pode funcionar melhor, pois o usuário não notaria nenhum redirecionamento / oscilação, menos solicitações de HTTP etc. etc. JS também funciona.
Beejor
9

JS angular faz dessa maneira.

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

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

porque ?

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

consulte isto:

msdn # 1 msdn # 2

Vishal Sharma
fonte
7

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

Coperniko
fonte
1
Meu favorito - é responsável pelo IE6-10 e IE11. Eu adicionei em um cheque de borda bem
AlbatrossCafe
Isso detecta o Firefox comoThis is IE 0
KSPR
3

Estou usando um método mais simples:

O objeto global do navegador possui pontos de contato de propriedade, no Internet Exlorer 11 é chamado de msMaxTouchPoints tho.

Então, se você procurar:

navigator.msMaxTouchPoints !== void 0 

Você encontrará o Internet Explorer 11.

Dvid Silva
fonte
1
Ele também retorna trun no IE 10 (Win 7)
Programador de produtos químicos
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
fonte
Se você estiver usando um regex no chec, poderá adicionar o sinalizador i para torná-lo sem distinção entre maiúsculas e minúsculas, em vez de .toLowerCase (). Também não há necessidade do método .toString ().
Jake Rowsell
2

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")
}
Krunal
fonte
Código incorreto porque o navegador Acoo usa "MSIE" no agente do usuário. Veja useragentstring.com/pages/Acoo%20Browser
Usuário
ARGUMENTO ERRADO. Eu testei em todos os navegadores IE, até dispositivos Win8 também.
precisa
Você testou o navegador IE11, mas não o navegador Acoo, e o navegador Acoo usa "MSIE" no agente do usuário, como eu disse para que o IEold também detecte o navegador Acoo como IEold (a versão antiga do IE) e tenho certeza de que o navegador Acoo usa " MSIE "no useragent porque eu fiz navigator.userAgent em um site de teste de javascript com o navegador Acoo (Site de teste: w3schools.com )
User
Você pode dar uma solução melhor para isso?
Krunal
Você pode usar, !navigator.userAgent.match("Acoo Browser;") && navigator.userAgent.match(/MSIE/i) ? true : falsemas isso nem sempre funciona, porque o navegador acoo nem sempre tem "Acoo Browser;" em seu useragent, mas na verdade você não precisa se preocupar com o fato de o navegador acoo ter "MSIE" em seu user agent, porque o navegador acoo é quase o mesmo.
Utilizador
1

Este parece ser um método melhor. "indexOf" retorna -1 se nada for correspondido. Ele não substitui as classes 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';
}
Joe
fonte
0

Detecte 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

Earlrails
fonte
0

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

onscroll="if (document.activeElement==this) ignoreHideOptions()"
Martin
fonte
0

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

use alerta (ie);

Teste:

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

Atualização 01 de junho de 2017

Agora poderíamos usar algo mais fácil e mais simples:

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
fonte
Onde posso encontrar os novos objetos globais padrão adicionados às novas versões do Edge? Eu deduzo que Math.acosh é um desses.
J4v1
1
@ j4v1 Math.acosh Only é suportado no Microsoft Edge (navegador Edge). Ref: msdn.microsoft.com/en-us/en-en/library/dn858239(v=vs.94).aspx
James Peter
Este método parou de funcionar para mim. No passado, ele detectou corretamente o IE11, mas agora eu tenho o Internet Explorer versão 11.1198.14393.0 (versão de atualização 11.0.42 (KB4018271)) em execução no Windows 10 Enterprise (versão 1607, compilação do sistema operacional 14393.1198) O Math parece oferecer suporte ao método acosh.
Thijs
@Thijs No Windows 10 Education com IE11 v 11.1198.14393.0 Testei com sucesso. Você deve tentar outra função matemática de acordo com ES6.
James Peter
@JamesPeter Cheguei à verificação de document.documentMode. Essa parece ser uma propriedade mais confiável para verificar o IE11 ou o Edge. O documentMode existe no IE11, mas não existe mais no Edge.
Thijs
0

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 estará equipada para essas mudanças e a análise manual usando expressões regulares falhará.

Graças a Deus o IE vai embora ...

Matthias Hryniszak
fonte