Quando recebemos um relatório de que ocorreu um problema no navegador Internet Explorer 11 (doravante chamado de IE11) em um sistema que vinha rodando sem problemas até agora, descobrimos que o formato do agente de usuário havia sido alterado no IE11 e o processo de julgamento do navegador foi tratado como um "navegador desconhecido".
Até agora, eu vinha usando o token da versão do navegador do user agent (a parte onde o UA diz "MSIE 9.0" ou algo assim) para obter o julgamento do navegador IE e a versão do IE, mas a partir do IE11, esse token de versão do navegador desapareceu, e um novo token de revisão chamado "RV" foi fornecido (*modo padrão do navegador do IE11).
Para julgar de forma única o IE, incluindo o IE11 no futuro, a confirmação da existência do token Trident do motor de navegador (a parte onde "Trident/7.0" em UA está escrito) também deve ser determinada pela condição OR.
UserAgent no IE11
- [Modo navegador: padrão] Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) como Gecko
- [Modo navegador: exibição de compatibilidade] Mozilla/4.0 (compatível; MSIE 7.0; Windows NT 6.3; Trident/7.0)
O problema é o modo de exibição de compatibilidade do IE. O modo de exibição de compatibilidade do IE é um recurso introduzido pelo IE9, mas se você usar esse modo, o token da versão do navegador UA será o IE7 em todos os IEs atuais. Para julgar corretamente o IE11 como exibição de compatibilidade, é necessário primeiro determinar o token tridente, e se a versão do trident for 7.0 ou superior, ele é julgado como IE11, e a versão do navegador é obtida a partir do token de revisão, e a outra versão é obtida do token da versão do navegador. Além disso, é necessário processar para IE9 e IE10, que possuem modos de exibição de compatibilidade inferiores ao IE11.
Além disso, IE7 e inferiores não possuem token trident, então também é necessário processamento separado de julgamento para IE7... (Não, é como assédio...).
Como teste, modifiquei o processamento único de julgamento de dispositivo cliente (PHP) usado neste DEVLAB para suportar o IE11.
Primeiramente, o conteúdo do processamento de julgamento do IE até agora.
[php] $ua = $_SERVER['HTTP_USER_AGENT']; $results['navegador'] = ''; $results['versão'] = ''; se (grávido_match('/(MSIE \d{1,}?(. \d{1,}?) {1,}?;) /', $ua, $mtcs)) { $results['browser'] = 'msie'; list(, $vstr) = explode(' ', str_replace(';', '', $mtcs[0])); $results['versão'] = $vstr; } [/php]
Eu mudei isso da seguinte forma.
O processamento do extrator de números de versão também foi meio fraco, então corrigi.
[php] $ua = $_SERVER['HTTP_USER_AGENT']; $results['browser'] = ''; $results['versão'] = ''; se (preg_match('/Trident\/(\d{1,}(.\d{1,}){1,}?) /i', $ua, $mtcs)) { $results['browser'] = 'msie'; se (float)$mtcs[1] >= 7) { se (preg_match('/rv:(\d{1,}(.\d{1,}){1,}?) /i', $ua, $mtcs)) { $results['versão'] = (flutuar)$mtcs[1]; } senão { $results['versão'] = 11.0; } } elseif (float)$mtcs[1] >= 6) { $results['version'] = 10.0; } elseif (float)$mtcs[1] >= 5) { $results['versão'] = 9.0; } elseif (float)$mtcs[1] >= 4) { $results['version'] = 8.0; } } if (vty($results['browser'])) { if (grávida_match('/MSIE\s(\d{1,}(.\d{1,}){1,}? ); /i', $ua, $mtcs)) { $results['browser'] = 'msie'; $results['versão'] = (flutuar)$mtcs[1]; } } [/php]
Não gosto que existam tantos passos só para julgar, por exemplo...
Para ser honesto, gostaria que você parasse de mudar o formato do UserAgent com upgrades além de alterações no motor do navegador ou grandes mudanças fundamentais nas especificações...