JavaScript: posso detectar o IE9 se ele estiver no modo de compatibilidade do IE7 ou IE8?

87

Preciso saber se o navegador que está se identificando por meio da string do agente do usuário como sendo IE7 ou IE8 é realmente esses navegadores, ou se é IE9 no modo de compatibilidade 7 ou 8.

Pelo que posso ver na string do agente do usuário, um IE9 no modo de compatibilidade do IE7 oferece uma string idêntica a um IE7 real. Existe uma propriedade / elemento / objeto extra que eu possa testar para ver se é "realmente" o IE9 disfarçado?

Presumo que o modo de documento não vá ajudar, pois a página em que meu script é carregado pode estar forçando peculiaridades ou forçando uma configuração específica.

Espero que o IE9 tenha alguma propriedade que exista e seja testável, independentemente de estar no modo 7, 8 ou 9.


Editado para adicionar…

OK, eu vejo onde estava errado agora. Eu estava usando o menu suspenso "Modo de navegador" e mudando para o IE8 e IE7 e pensando que era "modo de compatibilidade do IE8" e "modo de compatibilidade do IE7", respectivamente. Isto naturalmente não é verdade. O modo de navegador das ferramentas do desenvolvedor realmente está mudando para "ser como" aqueles navegadores antigos, então é correto que as strings do agente do usuário originais sejam relatadas.

Se eu deixar o modo de navegador na compatibilidade do IE9 ou IE9 e tentar as variantes suspensas do modo de documento em vez disso, recebo "Trident / 5.0" presente em todas as 8 combinações (dois modos de navegador e 4 modos de documento). Só preciso evitar a escolha do modo de navegador IE7 e IE8 porque eles realmente são (simulados) IE7 e IE8.

Portanto, não há como uma página, um usuário não desenvolvedor, uma meta tag ou lista de compatibilidade da Microsoft ser capaz de colocar o IE9 nesse estado não identificável.

Apenas usar if(navigator.userAgent.indexOf("Trident/5")>-1)será suficiente.

Não se preocupe, isso não é para estilos, formatação, lógica ou conteúdo de página. Eu uso a detecção de recursos para essas coisas. Eu só preciso detectar o IE9 (independentemente do modo em que esteja) e tomar uma decisão quanto ao conteúdo que não seja da página.

Obrigado por me direcionar para a resposta com suas sugestões e links.

Dee2000
fonte
1
Nunca confie no agente do usuário ... ele pode mentir perfeitamente e não há como ter certeza se ele está dizendo a verdade ou não ... você deve testar funções ou recursos específicos
JCOC611
2
@ JCOC611 Sim e não. Esta é uma questão específica de como descobrir se é o IE9 no modo de exibição de compatibilidade, o que é uma questão razoável. Em geral, não se deve confiar nas strings do agente do usuário para a funcionalidade do site, pois pode-se facilmente fingir, é verdade.
Dennis G
1
Mesmo que o agente do usuário seja preciso, é preferível usar a detecção de recursos, se possível. Então, você não precisa saber se o IE está ou não em modo de compatibilidade em primeiro lugar.
Dave Ward
1
Só quero acrescentar que isso é muito útil se você deseja fornecer um tutorial rápido para usuários que estão usando um modo de navegador errado.
Joost
1
@ JCOC611 quem falsificaria seu useragent e esperaria que as coisas funcionassem corretamente - devemos realmente nos preocupar com esse caso?
JohnnyFaldo

Respostas:

67

Na verdade, a string do agente do usuário é diferente para o IE9 quando executado no modo de compatibilidade do IE7, portanto, essa seria uma das melhores maneiras de distinguir entre as diferentes versões do IE.

Apresentando a string do agente do usuário do IE9 :

Semelhante ao IE8, a Visualização de Compatibilidade do IE9 será mapeada para o Modo Padrões do IE7, e a string UA do IE9 quando na Visualização de Compatibilidade será:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)

No modo de exibição de compatibilidade, o IE9 relata a si mesmo como IE7 por meio do número da versão do aplicativo (Mozilla / 4.0) e do token da versão (MSIE 7.0). Isso é feito para compatibilidade. Um token Trident incrementado, de 'Trident / 4.0' para 'Trident / 5.0', permite que os sites distingam entre o IE9 em execução no modo de exibição de compatibilidade e o IE8 em execução no modo de exibição de compatibilidade .

(ênfase adicionada por mim). Portanto, a string do agente do usuário é a mesma que informa ser "Mozilla / 4.0" e MSIE 7.0, mas o IE9 sempre será Trident / 5.0 - não importa se ele diz MSIE 7.0, MSIE 8.0 ou MSIE 9.0.

Na verdade, você deve verificar esta ótima compilação: Strings de ID do navegador (User-Agent) ou ainda melhor useragentstrings.com

Dennis G
fonte
1
Oi moontear. Também vi que o "Trident / 5.0" deve estar presente quando o IE9 está no modo IE7, mas não é isso que estou vendo no meu (final) IE9 no Win7 Pro x64. Ele não mostra nenhum tridente no modo IE7 (que é a aparência do IE7 real) e está mostrando o tridente 4 no modo IE8 (novamente, como o IE8 real se parece). Estou usando o menu suspenso de ferramentas do desenvolvedor do IE9 primeiro para selecionar o modo do navegador e, em seguida, na barra de endereço alertando javascript: alert (navigator.userAgent)
Dee2000
1
"Trident / 5.0" está presente na string do agente do usuário do IE9 em todos os modos.
EricLaw
Como EricLaw diz, Dee. O Trident / 5.0 deve estar presente quando você estiver usando o modo de compatibilidade (pode ser diferente para o modo de navegador?). Como você verifica a string do agente do usuário? Tente verificar em whatsmyuseragent.com e relate.
Dennis G
Veja minha resposta abaixo (eu tive que usar outro id Dee2001 por causa de uma regra de 8 horas de estouro de pilha sobre como adicionar uma resposta à sua própria mensagem). Sim, Eric e Moontear estão corretos, Trident / 5.0 está presente em todos os modos do IE9. Meu grande erro foi mudar o "Modo do navegador" para IE7 ou IE8 nas ferramentas do desenvolvedor, mas esse não é um "modo" que uma página / meta tag / lista de compatibilidade pode impor. Em vez disso, está realmente simulando os próprios navegadores, então, naturalmente, a string useragent é realmente como o IE7 / 8.
Dee2000,
1
Isto é perfeito! Muito obrigado. Não faço estilo com base no navegador relatado, mas estou configurando uma barra de aviso na parte superior do site em que estou trabalhando que diz que o usuário precisa atualizar (se as tags condicionais dizem que é menor ou igual a ie7) - Não quero que a mensagem diga upgrade neste caso, mas sim desative o modo de compatibilidade
Chelsea Urquhart
47

document.documentMode é a melhor maneira para o modo de documento.

Yuhong Bao
fonte
17
Por favor, expanda um pouco a resposta. Mais contexto.
random_user_name
3
Por que as pessoas não estão adicionando isso, é exatamente o que é necessário
Jamie Hutber
5
Essa é realmente a melhor maneira. Você pode usá-lo desta forma: <script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>. O real (!) IE7 e todos os não-IEs retornam 'indefinido', apenas IE8 / 9 em Comp. mode return 7. Não consigo testar o IE10, mas deve ser o mesmo.
Frank Conijn
2
Tentei fazer isso no IE10 em um lado com a tag META da borda; normalmente, ele retorna "10". Força o modo de compatibilidade ativado para todos os sites e ainda retorna "10".
Whelkaholism
Funciona para mim no IE10 e visualização do IE11
Simon Keep
20

IE7 não contém informações sobre o Trident

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0)

IE8 contém esta string: "Trident / 4.0"

User-Agent : Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0)

IE9 contém esta string: "Trident / 5.0"

IE9 em modo de compatibilidade:

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0; Trident/5.0)

IE9 em modo normal:

User-Agent : Mozilla/5.0 (compatible; MSIE 9.0; Trident/5.0)
Greg
fonte
1
Isso é ótimo, o IE10 também incrementa o Trident?
slotishtype
3
Usuários do Internet explorer 10 Trident / 6.0 .... consulte blogs.msdn.com/b/ie/archive/2012/07/12/…
slotishtype
1
e o IE11 usa Trident / 7.0
Dee2000
11

Espero que o IE9 tenha alguma propriedade que exista e seja testável, independentemente de estar no modo 7, 8 ou 9.

Verifique, por exemplo, para style.opacity , foi introduzido no IE9 e está disponível independentemente do modo de compatibilidade:

<![if IE]> 
<script>
if(typeof document.documentElement.style.opacity!='undefined')
{
  //this must be at least IE9 
}
</script>
<![endif]>
Dr.Molle
fonte
1
Obrigado Dr.Molle, vou tentar e relatar de volta.
Dee2000
Infelizmente, isso só funciona para o modo de navegador (a lista suspensa à esquerda nas ferramentas de desenvolvedor do IE9). Não funciona no modo Documento (o menu suspenso à direita). Para o modo de documento, ele só funciona no modo de documento do IE9. Se estiver no modo IE8, IE7 ou Quirks, essa lógica falha.
Dee2000
7
Droga, você está certo. Eu encontrei um outro imóvel, funciona para mim em todos os modos: window.performance
Dr.Molle
@ Dee2000: Funciona para mim com DocumentMode também. Ou seja, SOMENTE se DocumentMode = "Internet Explorer 9 padrão" esse teste foi bem-sucedido.
Niklas Bäckman
@ Dr.Molle obrigado por isso, window.performance faz o trabalho muito bem.
lewsid
3

Às vezes, é necessário ler a string do Agente do usuário da variável do servidor, não do objeto navegador javascript.

Compare as diferenças:

  • ASP clássico, IE11

    • cliente javascript, navigator.userAgent: " Mozilla / 5.0 (compatível; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS) "

    • servidor ASP, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; BOIE9; ENUS; rv: 11.0) como Gecko "

  • ASP clássico, modo de compatibilidade do IE11 :

    • cliente javascript, navigator.userAgent: " Mozilla / 5.0 (compatível; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS)) "

    • servidor ASP, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 4.0 (compatível; MSIE 7.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS) "

Pažout
fonte
0

De https://stackoverflow.com/a/29288153/2879498

Supondo que você tenha um elemento oculto com o ID compat-warning:

Javascript com jQuery:

$(function(){
    function showCompatWarning() {
        $('#compat-warning')
            .css('display','block')
            .css('height','auto')
            .show();
    }
    var tridentOffset = navigator.appVersion.indexOf('Trident/');
    if ( tridentOffset === -1 ) return;
    var jscriptVersion = 0;
    /*@cc_on @*/
    /*@if (@_jscript) jscriptVersion = @_jscript_version ; @*/;
    /*@end @*/
    var tridentVersion = parseInt(navigator.appVersion.substr(tridentOffset+8),10);
    var guessIEVersion = tridentVersion + 4;
    if (( document.documentMode && jscriptVersion && jscriptVersion < 10 && jscriptVersion !== document.documentMode ) ||
        ( document.compatMode && document.compatMode === 'BackCompat') ||
        ( document.documentMode && document.documentMode < 10 && document.documentMode != guessIEVersion ))
        showCompatWarning();
});

Detecção e avisos, sua primeira e última linha de defesa contra o inferno da compatibilidade.

TylerY86
fonte