Detectar a versão do IE (anterior à v9) em JavaScript

246

Desejo devolver os usuários do nosso site a uma página de erro se eles estiverem usando uma versão Internet Exploreranterior à v9. Simplesmente não vale nosso tempo e dinheiro para apoiar IE pre-v9. Os usuários de todos os outros navegadores que não sejam do IE são bons e não devem ser devolvidos. Aqui está o código proposto:

if(navigator.appName.indexOf("Internet Explorer")!=-1){     //yeah, he's using IE
    var badBrowser=(
        navigator.appVersion.indexOf("MSIE 9")==-1 &&   //v9 is ok
        navigator.appVersion.indexOf("MSIE 1")==-1  //v10, 11, 12, etc. is fine too
    );

    if(badBrowser){
        // navigate to error page
    }
}

Esse código fará o truque?

Para evitar alguns comentários que provavelmente aparecerão no meu caminho:

  1. Sim, eu sei que os usuários podem forjar suas useragent string. Eu não estou preocupado.
  2. Sim, eu sei que os profissionais de programação preferem farejar o suporte a recursos em vez do tipo de navegador, mas não acho que essa abordagem faça sentido nesse caso. Eu já sei que todos os navegadores (relevantes) que não são do IE suportam os recursos que eu preciso e que todospre-v9 IE navegadores não. Verificar recurso por recurso em todo o site seria um desperdício.
  3. Sim, eu sei que alguém tentando acessar o site usando IE v1 (ou> = 20) não conseguiria 'badBrowser' definido como true e a página de aviso não seria exibida corretamente. Esse é um risco que estamos dispostos a correr.
  4. Sim, eu sei que a Microsoft tem "comentários condicionais" que podem ser usados ​​para detecção precisa da versão do navegador. O IE não suporta mais comentários condicionais a partir de IE 10, tornando essa abordagem absolutamente inútil.

Quaisquer outros problemas óbvios para estar ciente?

Chad Decker
fonte
122
"Simplesmente não vale nosso tempo e dinheiro para apoiar o IE pré-v9". Queria poder fazer isso.
Hassan
2
Com base no ponto [2] Eu não vou sugerir Modernizr ( en.wikipedia.org/wiki/Modernizr ) - todo mundo tem que desenhar uma linha na areia em algum lugar - mas IE9 parece ser uma linha de alta
amelvin
1
Comentários condicionais são apenas comentários normais. Somente o IE os interpreta como especiais. O IE10 + não fará mais isso.
Andreas
3
Comentários condicionais serão tratados exatamente pelo mesmo IE 10 como navegadores não-IE. Como comentários em HTML válidos, serão tratados como tal. Concordo com Andreas e acho que comentários condicionais são o caminho a percorrer.
Tim Down
1
A documentação oficial que diz que o IE10 + não suporta comentários condicionais: blogs.msdn.com/b/ie/archive/2011/07/06/… - Agradecimentos a: stackoverflow.com/a/9900331/320399
blong

Respostas:

354

Esta é a minha maneira preferida de fazê-lo. Dá o controle máximo. (Nota: Instruções condicionais são suportadas apenas em IE5 - 9.)

Primeiro configure suas classes ie corretamente

<!DOCTYPE html>
<!--[if lt IE 7]> <html class="lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>    <html class="lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>    <html class="lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html> <!--<![endif]-->    
<head>

Em seguida, você pode apenas usar CSS para criar exceções de estilo ou, se necessário, adicionar algum JavaScript simples:

(function ($) {
    "use strict";

    // Detecting IE
    var oldIE;
    if ($('html').is('.lt-ie7, .lt-ie8, .lt-ie9')) {
        oldIE = true;
    }

    if (oldIE) {
        // Here's your JS for IE..
    } else {
        // ..And here's the full-fat code for everyone else
    }

}(jQuery));

Agradecimentos a Paul Irish .

Jezen Thomas
fonte
21
Dado que o OP solicitou uma solução puramente JavaScript, acredito que a resposta de @Tim Down abaixo é melhor, pois não envolve a alteração do HTML existente, além de não usar o jQuery: stackoverflow.com/a/10965203/134120
AsGoodAsItGets
Eu recebo um erro com isso no validador w3 html:Error: Saw <!-- within a comment. Probable cause: Nested comment (not allowed). At line 5, column 21 if gt IE 8]><!--><html
abumalick
161

Retorna a versão do IE ou, se não, o IE retorna false

function isIE () {
  var myNav = navigator.userAgent.toLowerCase();
  return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
}

Exemplo:

if (isIE () == 8) {
 // IE8 code
} else {
 // Other versions IE or not IE
}

ou

if (isIE () && isIE () < 9) {
 // is IE version less than 9
} else {
 // is IE 9 and later or not IE
}

ou

if (isIE()) {
 // is IE
} else {
 // Other browser
}
weroro
fonte
36
Não funciona para o IE11. A partir do IE 11, eles alteraram a string UA para"mozilla/5.0 (windows nt 6.3; wow64; trident/7.0; .net4.0e; .net4.0c; media center pc 6.0; .net clr 3.5.30729; .net clr 2.0.50727; .net clr 3.0.30729; rv:11.0) like gecko"
Annie
22
Observe que em FF "false <9" é "true". Assim, a condição deve serif (isIE () && isIE () < 9) {
nZeus
3
@DeadlyChambers talvez estivesse sendo executado no modo de padrões do IE7? msdn.microsoft.com/pt-br/library/ie/cc196988(v=vs.85).aspx
mason81
4
A resposta aprovada é como detectar a versão do IE em HTML. Isso responde à pergunta original.
Matt Wagner
2
@PrasadGayan - O Microsoft Edge não é o Internet Explorer. Portanto, retornar falso parece ser a coisa certa a fazer.
precisa saber é o seguinte
120

Se ninguém mais adicionou um addEventListermétodo-e você estiver usando o modo de navegador correto, poderá verificar o IE 8 ou menos com

if (window.attachEvent && !window.addEventListener) {
    // "bad" IE
}

Internet Explorer herdado e attachEvent (MDN)

Andreas
fonte
7
Essa parece ser a maneira mais eficiente de detectar o IE <= 8 inteiramente em JavaScript - e é ótima para pessoas como eu, que estavam procurando uma maneira de fazê-lo.
Gregory Magarshak
Ótimo! Isso também detecta o IE9 no modo Quirks, que é o que eu estava procurando.
SSTUR
7
Embora seja uma solução "fácil de usar", ela apresenta alguns riscos. Qualquer pessoa em sua empresa (que não esteja ciente da sua solução) pode implementar "addEventListener" ou "attachEvent" para lidar com a falta dele no IE 8. E então, seu código interromperá o trabalho.
Zé Carlos
@RoyiNamir Faz testes para o IE8. Por que diabos isso deve voltar ao IE11?
Andreas
@Andreas oops. não viu que o OP quer antes do ie9. excluindo.
Royi Namir
114

Use comentários condicionais. Você está tentando detectar usuários do IE <9 e comentários condicionais funcionarão nesses navegadores; em outros navegadores (IE> = 10 e não IE), os comentários serão tratados como comentários HTML normais, que são o que são.

Exemplo de HTML:

<!--[if lt IE 9]>
WE DON'T LIKE YOUR BROWSER
<![endif]-->

Você também pode fazer isso puramente com script, se precisar:

var div = document.createElement("div");
div.innerHTML = "<!--[if lt IE 9]><i></i><![endif]-->";
var isIeLessThan9 = (div.getElementsByTagName("i").length == 1);
if (isIeLessThan9) {
    alert("WE DON'T LIKE YOUR BROWSER");
}
Tim Down
fonte
5
A versão JavaScript da resposta de @Tim Down funcionou muito bem para mim. Eu usei o BrowserStack para testá-lo no Windows 7 e IE 8, 9, 10 e 11; Mac OS X Snow Leopard com Safari 5.1, Firefox 28.0, Chrome 33.0 e Opera 20.0; Safari móvel para iPhone 5; e Android Samsung Galaxy Tab 2 10.1 4.0. Como esperado, apenas o IE8 informou que era IeLessThan9. Agradável!
precisa
58

Para detectar o MSIE (v6 - v7 - v8 - v9 - v10 - v11) facilmente:

if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) {
   // MSIE
}
EpokK
fonte
Útil para detectar o IE10, pois não suporta comentários condicionais. Não funciona no IE11, mas IE11 geralmente tem um comportamento bem
personne3000
11
Finalmente, uma resposta que não ensina sobre o uso da detecção de recursos e realmente responde à pergunta.
Cdmckay
32

Aqui está a maneira como o AngularJS verifica o IE

/**
 * documentMode is an IE-only property
 * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
 */
var msie = document.documentMode;

if (msie < 9) {
    // code for IE < 9
}
iurii
fonte
Uau, isso é muito mais simples do que todos os comentários condicionais! Sem limitações disso?
22615 Andrewb
de acordo com os documentos, o IE8 + suporta essa propriedade, então acho que deve ser suficiente para a maioria dos casos.
Iurii 24/07/2015
Pela referência do MSDN, "Quando o documento atual ainda não foi determinado, o documentMode retorna um valor zero (0). Isso geralmente acontece quando um documento está sendo carregado." Isso significa que você pode não obter uma resposta válida dentro de um script carregado em <head>?
Erik Knowles
Eu acho que você pode corrigi-lo verificando o valor em window.onload quando o documento já estiver carregado.
Iurii 30/07/2015
19

Detectando a versão do IE usando a detecção de recursos (o IE6 +, os navegadores anteriores ao IE6 são detectados como 6, retorna nulo para os navegadores que não são do IE):

var ie = (function (){
    if (window.ActiveXObject === undefined) return null; //Not IE
    if (!window.XMLHttpRequest) return 6;
    if (!document.querySelector) return 7;
    if (!document.addEventListener) return 8;
    if (!window.atob) return 9;
    if (!document.__proto__) return 10;
    return 11;
})();

Edit: Eu criei um repositório bower / npm para sua conveniência: ie-version

Atualizar:

uma versão mais compacta pode ser escrita em uma linha como:

return window.ActiveXObject === undefined ? null : !window.XMLHttpRequest ? 6 : !document.querySelector ? 7 : !document.addEventListener ? 8 : !window.atob ? 9 : !document.__proto__ ? 10 : 11;
Gabriel Llamas
fonte
16

Essa função retornará o número da versão principal do IE como um número inteiro ou undefinedse o navegador não for o Internet Explorer. Isso, como todas as soluções de agente de usuário, é aceitável para falsificação de agente de usuário (que é um recurso oficial do IE desde a versão 8).

function getIEVersion() {
    var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:)(\d+)/);
    return match ? parseInt(match[1]) : undefined;
}
Owen
fonte
Owen, como alguém usa isso na prática? Como se recupera o valor de retorno? Eu tentei console.log(!!match && parseInt(match[1])), console.log(parseInt(match[1]))e console.log(match), mas nenhum resultado com qualquer um deles.
Frank Conijn
Obtenha o valor de retorno chamando a própria função getIEVersion(). Por exemplo:if (getIEVersion() < 9) {/* IE 8 or below */} if (!getIEVersion()) {/* Not IE */}
Owen
15

Detectar o IE em JS usando comentários condicionais

// ----------------------------------------------------------
// A short snippet for detecting versions of IE in JavaScript
// without resorting to user-agent sniffing
// ----------------------------------------------------------
// If you're not in IE (or IE version is less than 5) then:
//     ie === undefined
// If you're in IE (>=5) then you can determine which version:
//     ie === 7; // IE7
// Thus, to detect IE:
//     if (ie) {}
// And to detect the version:
//     ie === 6 // IE6
//     ie > 7 // IE8, IE9 ...
//     ie < 9 // Anything less than IE9
// ----------------------------------------------------------

// UPDATE: Now using Live NodeList idea from @jdalton

var ie = (function(){

    var undef,
        v = 3,
        div = document.createElement('div'),
        all = div.getElementsByTagName('i');

    while (
        div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
        all[0]
    );

    return v > 4 ? v : undef;

}());
jKey
fonte
É praticamente o mesmo que a minha resposta.
Tim Baixo
@ TimDown: Talvez, mas esta resposta é um pouco mais completa (com o número da versão) e é bem comentada. Além disso, o link no início desta resposta leva a um Gist com vários comentários informativos e variações interessantes sobre essa técnica.
Alan em Alan
@ Alan: pontos justos. Eu adaptei o meu à pergunta, mas não citei a fonte.
Tim baixo
12

Isso funciona para mim. Eu o uso como um redirecionamento para uma página que explica por que não gostamos do <IE9 e fornecemos links para os navegadores que preferimos.

<!--[if lt IE 9]>
<meta http-equiv="refresh" content="0;URL=http://google.com">
<![endif]-->
iconMatrix
fonte
1
Ohw, isso é desagradável. Eu uso um método mais amigável, exibir uma div com a aparência de um aviso IE e quando visitante clique sobre ele o usuário vai para browsehappy.com
Codebeat
10

Seu código pode fazer a verificação, mas como você pensou, se alguém tentar acessar sua página usando o IE v1 ou> v19 não receberá o erro, portanto, pode ser mais seguro verificar a expressão Regex como este código abaixo:

var userAgent = navigator.userAgent.toLowerCase();
// Test if the browser is IE and check the version number is lower than 9
if (/msie/.test(userAgent) && 
    parseFloat((userAgent.match(/.*(?:rv|ie)[\/: ](.+?)([ \);]|$)/) || [])[1]) < 9) {
  // Navigate to error page
}
Fong-Wan Chau
fonte
Esta não é uma boa resposta. UA-sniffing não é confiável. Mais sobre isso aqui: modernizr.com/docs
Jezen Thomas
3
@Jezen Às vezes UA-sniffing é o caminho a percorrer: github.com/Modernizr/Modernizr/issues/538
István Mészáros ujj-
8

Comentários condicionais não são mais suportados no IE a partir da versão 10, conforme observado na página de referência da Microsoft .

var ieDetector = function() {
  var browser = { // browser object

      verIE: null,
      docModeIE: null,
      verIEtrue: null,
      verIE_ua: null

    },
    tmp;

  tmp = document.documentMode;
  try {
    document.documentMode = "";
  } catch (e) {};

  browser.isIE = typeof document.documentMode == "number" || eval("/*@cc_on!@*/!1");
  try {
    document.documentMode = tmp;
  } catch (e) {};

  // We only let IE run this code.
  if (browser.isIE) {
    browser.verIE_ua =
      (/^(?:.*?[^a-zA-Z])??(?:MSIE|rv\s*\:)\s*(\d+\.?\d*)/i).test(navigator.userAgent || "") ?
      parseFloat(RegExp.$1, 10) : null;

    var e, verTrueFloat, x,
      obj = document.createElement("div"),

      CLASSID = [
        "{45EA75A0-A269-11D1-B5BF-0000F8051515}", // Internet Explorer Help
        "{3AF36230-A269-11D1-B5BF-0000F8051515}", // Offline Browsing Pack
        "{89820200-ECBD-11CF-8B85-00AA005B4383}"
      ];

    try {
      obj.style.behavior = "url(#default#clientcaps)"
    } catch (e) {};

    for (x = 0; x < CLASSID.length; x++) {
      try {
        browser.verIEtrue = obj.getComponentVersion(CLASSID[x], "componentid").replace(/,/g, ".");
      } catch (e) {};

      if (browser.verIEtrue) break;

    };
    verTrueFloat = parseFloat(browser.verIEtrue || "0", 10);
    browser.docModeIE = document.documentMode ||
      ((/back/i).test(document.compatMode || "") ? 5 : verTrueFloat) ||
      browser.verIE_ua;
    browser.verIE = verTrueFloat || browser.docModeIE;
  };

  return {
    isIE: browser.isIE,
    Version: browser.verIE
  };

}();

document.write('isIE: ' + ieDetector.isIE + "<br />");
document.write('IE Version Number: ' + ieDetector.Version);

então use:

if((ieDetector.isIE) && (ieDetector.Version <= 9))
{

}
Arnold.Krumins
fonte
1
Esta foi a única coisa que funcionou em toda a rede, pelo menos o humongus das coisas que eu tentei ... thx;)
Henrique C.
Este código é bom, mas não pode detectar o modo de exibição de compabilidade. Estou no IE 11 usando o modo de compatibilidade no IE 8 e esse código ainda está dando version 11EDIT: Este código é INCRÍVEL! haha, dá um objeto com tudo dentro. A versão é 11, mas docModeIR é igual a 9. Obrigado!
MarceloBarbosa
5

Para ie 10 e 11:

Você pode usar js e adicionar uma classe em html para manter o padrão de comentários condicionais :

  var ua = navigator.userAgent,
      doc = document.documentElement;

  if ((ua.match(/MSIE 10.0/i))) {
    doc.className = doc.className + " ie10";

  } else if((ua.match(/rv:11.0/i))){
    doc.className = doc.className + " ie11";
  }

Ou use uma biblioteca como o bowser:

https://github.com/ded/bowser

Ou modernizr para detecção de recursos:

http://modernizr.com/

Liko
fonte
2
Eu tentei alguns scripts e soluções, mas nada funcionou. Então eu incluí o Bowser no projeto e funcionou. Então, um por sugerir besteira.
Moulde 19/01
3

Para detectar o Internet Explorer 10 | 11, você pode usar este pequeno script imediatamente após a tag body:

No meu caso, eu uso a biblioteca jQuery carregada na cabeça.

<!DOCTYPE HTML>
<html>
<head>
    <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
</head>
<body>
    <script>if (navigator.appVersion.indexOf('Trident/') != -1) $("body").addClass("ie10");</script>
</body>
</html>
Brian
fonte
I como este, obrigado, eu só precisa detectar 10 ou 11 como eu não suporta versões anteriores
NearPoint
O IE9 também é tridente, mas não é o mesmo com suporte a CSS. Sua detecção acha que é pelo menos 10, mas isso não está correto.
código é o seguinte
3

Isso foi respondido até a morte, mas é tudo o que você precisa.

!!navigator.userAgent.match(/msie\s[5-8]/i)
Timothy Perez
fonte
Além disso, aqui é uma caixa de areia mostrando o padrão regex contra a maioria das cadeias de agente comum de usuários IE: regex101.com/r/lC6oP3/1
Timothy Perez
@alessadro - Mas é suposto, não é? OP queria teste para <9 ...
nnnnnn
2
var Browser = new function () {
    var self = this;
    var nav = navigator.userAgent.toLowerCase();
    if (nav.indexOf('msie') != -1) {
        self.ie = {
            version: toFloat(nav.split('msie')[1])
        };
    };
};


if(Browser.ie && Browser.ie.version > 9)
{
    // do something
}
Berezh
fonte
2

Segundo a Microsoft , a seguir é a melhor solução, também é muito simples:

function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
    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;
}

function checkVersion()
{
    var msg = "You're not using Internet Explorer.";
    var ver = getInternetExplorerVersion();

    if ( ver > -1 )
    {
        if ( ver >= 8.0 ) 
            msg = "You're using a recent copy of Internet Explorer."
        else
            msg = "You should upgrade your copy of Internet Explorer.";
      }
    alert( msg );
}
AHH
fonte
De fato, e apenas no caso de alguém aparecer aqui tentando usar o acima, o código em uma resposta posterior funciona para o IE11 ( stackoverflow.com/a/26375930/1129926 ). Mas cuidado, ele funcionará para o IE12 etc.? O ponto principal é o melhor para considerá-los hacks temporários e provavelmente falharão depois que novas versões do navegador forem lançadas (nem vou mencionar o Edge).
Jeff Mergler
1

Vou recomendar não reescrever esse código pela enésima vez. Eu recomendo que você use a biblioteca Conditionizr ( http://conditionizr.com/ ), que é capaz de testar versões específicas do IE, bem como outros navegadores, sistemas operacionais e até a presença ou ausência de telas Retina.

Inclua o código apenas para os testes específicos necessários e você também obterá o benefício de uma biblioteca testada que passou por muitas iterações (e que seria fácil de atualizar sem quebrar o código).

Ele também combina bem com o Modernizr, que pode lidar com todos os casos em que é melhor testar um recurso específico em vez de um navegador específico.

John Munsch
fonte
1

Eu faço assim:

<script>
   function isIE () {
       var myNav = navigator.userAgent.toLowerCase();
       return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
   }    
   var ua = window.navigator.userAgent;
   //Internet Explorer | if | 9-11

   if (isIE () == 9) {
       alert("Shut down this junk! | IE 9");
   } else if (isIE () == 10){
       alert("Shut down this junk! | IE 10");
   } else if (ua.indexOf("Trident/7.0") > 0) {
       alert("Shut down this junk! | IE 11");
   }else{
       alert("Thank god it's not IE!");
   }

</script>
Julio Cesar Boaroli
fonte
1

Essa abordagem para detectar o IE combina os pontos fortes e evita os pontos fracos da resposta do jKey usando comentários condicionais e a resposta de Owen usando agentes do usuário.

  • A abordagem do jKey funciona até a versão 9 e imune à falsificação de agentes do usuário no IE 8 e 9.
  • A abordagem de Owen pode falhar no IE 5 e 6 (relatório 7) e é suscetível à falsificação de UA, mas pode detectar versões do IE> = 10 (agora também inclui 12, que pós-datam a resposta de Owen).

    // ----------------------------------------------------------
    // A short snippet for detecting versions of IE
    // ----------------------------------------------------------
    // If you're not in IE (or IE version is less than 5) then:
    //     ie === undefined
    // Thus, to detect IE:
    //     if (ie) {}
    // And to detect the version:
    //     ie === 6 // IE6
    //     ie > 7 // IE8, IE9 ...
    // ----------------------------------------------------------
    var ie = (function(){
        var v = 3,
            div = document.createElement('div'),
            all = div.getElementsByTagName('i');
    
        while (
            div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
            all[0]
        );
        if (v <= 4) { // Check for IE>9 using user agent
            var match = navigator.userAgent.match(/(?:MSIE |Trident\/.*; rv:|Edge\/)(\d+)/);
            v = match ? parseInt(match[1]) : undefined;
        }
        return v;
    }());

Isso pode ser usado para definir classes úteis para o seu documento que contém a versão do IE:

    if (ie) {
        document.documentElement.className += ' ie' + ie;
        if (ie < 9)
            document.documentElement.className += ' ieLT9';
    }

Observe que ele detecta o modo de compatibilidade que está sendo usado, se o IE estiver no modo de compatibilidade. Observe também que a versão do IE é útil principalmente para versões mais antigas (<10); versões superiores são mais compatíveis com os padrões e, provavelmente, é melhor procurar recursos usando algo como modernizr.js.

jtbr
fonte
1

Fiz um mix sublinhado conveniente para isso.

_.isIE();        // Any version of IE?
_.isIE(9);       // IE 9?
_.isIE([7,8,9]); // IE 7, 8 or 9?

_.mixin({
  isIE: function(mixed) {
    if (_.isUndefined(mixed)) {
      mixed = [7, 8, 9, 10, 11];
    } else if (_.isNumber(mixed)) {
      mixed = [mixed];
    }
    for (var j = 0; j < mixed.length; j++) {
      var re;
      switch (mixed[j]) {
        case 11:
          re = /Trident.*rv\:11\./g;
          break;
        case 10:
          re = /MSIE\s10\./g;
          break;
        case 9:
          re = /MSIE\s9\./g;
          break;
        case 8:
          re = /MSIE\s8\./g;
          break;
        case 7:
          re = /MSIE\s7\./g;
          break;
      }

      if (!!window.navigator.userAgent.match(re)) {
        return true;
      }
    }

    return false;
  }
});

console.log(_.isIE());
console.log(_.isIE([7, 8, 9]));
console.log(_.isIE(11));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

danrichards
fonte
1

ou simplesmente

//   IE 10: ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'; 
//   IE 11: ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; 
// Edge 12: ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0'; 
// Edge 13: ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'; 

var isIE = navigator.userAgent.match(/MSIE|Trident|Edge/)
var IEVersion = ((navigator.userAgent.match(/(?:MSIE |Trident.*rv:|Edge\/)(\d+(\.\d+)?)/)) || []) [1]
Giacomo
fonte
0

O script JS mais abrangente que eu encontrei para verificar versões do IE é http://www.pinlady.net/PluginDetect/IE/ . Toda a biblioteca está em http://www.pinlady.net/PluginDetect/Browsers/ .

Com o IE10, as instruções condicionais não são mais suportadas.

Com o IE11, o agente do usuário não contém mais o MSIE. Além disso, o uso do agente do usuário não é confiável, pois isso pode ser modificado.

Usando o script JS PluginDetect, você pode detectar para o IE e detectar as versões exatas usando um código muito específico e bem criado que se destina a versões específicas do IE. Isso é muito útil quando você se importa exatamente com qual versão do navegador você está trabalhando.

PressingOnAlways
fonte
0

Percebo que estou um pouco atrasado para a festa aqui, mas estava pesquisando uma maneira simples de fornecer uma resposta sobre se um navegador é o IE e qual versão de 10 em diante era. Eu não codifiquei isso para a versão 11, portanto, talvez seja necessária uma pequena alteração para isso.

No entanto, esse é o código, ele funciona como um objeto que possui uma propriedade e um método e depende da detecção de objetos, em vez de raspar o objeto do navegador (que é extremamente danificado, pois pode ser falsificado).

var isIE = { browser:/*@cc_on!@*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };

O uso é isIE.browseruma propriedade que retorna um valor booleano e se baseia em comentários condicionais, o método isIE.detectedVersion()que retorna um número entre 5 e 10. Estou assumindo que algo menor que 6 e você está em um território sério da velha escola e terá algo mais robusto do que um forro único e qualquer coisa maior que 10 e você está em um território mais novo. Li algo sobre o IE11 que não suporta comentários condicionais, mas ainda não investiguei completamente, talvez para uma data posterior.

De qualquer forma, como é, e para um liner, ele abordará o básico do navegador IE e da detecção de versão. Está longe de ser perfeito, mas é pequeno e pode ser facilmente alterado.

Apenas para referência, e se alguém tiver alguma dúvida sobre como realmente implementar isso, o seguinte condicional deve ajudar.

var isIE = { browser:/*@cc_on!@*/false, detectedVersion: function () { return (typeof window.atob !== "undefined") ? 10 : (typeof document.addEventListener !== "undefined") ? 9 : (typeof document.querySelector !== "undefined") ? 8 : (typeof window.XMLHttpRequest !== "undefined") ? 7 : (typeof document.compatMode !== "undefined") ? 6 : 5; } };

/* testing IE */

if (isIE.browser) {
  alert("This is an IE browser, with a detected version of : " + isIE.detectedVersion());
}
Ric
fonte
0

Detectar o IE e suas versões não poderia ser mais fácil, e tudo que você precisa é um pouco de Javascript nativo / baunilha:

var uA = navigator.userAgent;
var browser = null;
var ieVersion = null;

if (uA.indexOf('MSIE 6') >= 0) {
    browser = 'IE';
    ieVersion = 6;
}
if (uA.indexOf('MSIE 7') >= 0) {
    browser = 'IE';
    ieVersion = 7;
}
if (document.documentMode) { // as of IE8
    browser = 'IE';
    ieVersion = document.documentMode;
}

E esta é uma maneira de usá-lo:

if (browser == 'IE' && ieVersion <= 9) 
    document.documentElement.className += ' ie9-';

.

Funciona em todas as versões do IE, incluindo versões superiores no Modo / Exibição de Compatibilidade mais baixo, e documentModeé proprietário do IE.

Frank Conijn
fonte
0

Se você precisar excluir a versão do navegador IE, poderá seguir o código abaixo. Este código está funcionando bem para a versão IE6 para IE11

<!DOCTYPE html>
<html>
<body>

<p>Click on Try button to check IE Browser version.</p>

<button onclick="getInternetExplorerVersion()">Try it</button>

<p id="demo"></p>

<script>
function getInternetExplorerVersion() {
   var ua = window.navigator.userAgent;
        var msie = ua.indexOf("MSIE ");
        var rv = -1;

        if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))      // If Internet Explorer, return version number
        {               
            if (isNaN(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))))) {
                //For IE 11 >
                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);
                        alert(rv);
                    }
                }
                else {
                    alert('otherbrowser');
                }
            }
            else {
                //For < IE11
                alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
            }
            return false;
        }}
</script>

</body>
</html>
Nimesh
fonte
0

A janela executada no IE10 será atualizada automaticamente para o IE11 + e será padronizada no W3C

Atualmente, não precisamos oferecer suporte ao IE8-

    <!DOCTYPE html>
    <!--[if lt IE 9]><html class="ie ie8"><![endif]-->
    <!--[if IE 9]><html class="ie ie9"><![endif]-->
    <!--[if (gt IE 9)|!(IE)]><!--><html><!--<![endif]-->
    <head>
        ...
        <!--[if lt IE 8]><meta http-equiv="Refresh" content="0;url=/error-browser.html"><![endif]--
        ...
    </head>
xicooc
fonte
0
var isIE9OrBelow = function()
{
   return /MSIE\s/.test(navigator.userAgent) && parseFloat(navigator.appVersion.split("MSIE")[1]) < 10;
}
xicooc
fonte
0
if (!document.addEventListener) {
    // ie8
} else if (!window.btoa) {
    // ie9
}
// others
Bruce
fonte