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.
Respostas:
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 :
(ê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
fonte
document.documentMode
é a melhor maneira para o modo de documento.fonte
<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.IE7 não contém informações sobre o Trident
IE8 contém esta string: "Trident / 4.0"
IE9 contém esta string: "Trident / 5.0"
IE9 em modo de compatibilidade:
IE9 em modo normal:
fonte
Aqui está uma tabela de todos os modos de navegador e documento para o IE9 :
fonte
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:
fonte
À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) "
fonte
De https://stackoverflow.com/a/29288153/2879498
Supondo que você tenha um elemento oculto com o ID compat-warning:
Javascript com jQuery:
Detecção e avisos, sua primeira e última linha de defesa contra o inferno da compatibilidade.
fonte