É uma prática recomendada executar JavaScript diferente para o IE

8

É considerado uma má prática (e quão ruim) executar JavaScript diferente para o IE? Atualmente, estou escrevendo JavaScript e a maneira mais simples de trabalhar com as peculiaridades do IE parece verificar a versão do navegador e executar códigos diferentes

var browserName = navigator.appName;

if (browserName == "Microsoft Internet Explorer") {
  //Do some stuff
}
else
{
//Do other stuff
}

É rápido e funciona bem, mas leva à duplicação de código e parece "hacky".

Tom Squires
fonte
18
Pode-se dizer que é uma prática ruim para a Microsoft escrever um navegador para onde esse Javascript é necessário
maple_shaft
3
@keppla Melhores questões práticas são um ajuste melhor para programadores
Tom Squires
2
Não é apenas uma prática ruim, é absolutamente essencial. Veja o que o JQuery precisa passar.
GrandmasterB
2
@keppla - na verdade não. Ele não está perguntando como fazê-lo, mas se é uma boa prática ou não.
ChrisF
8
A prática realmente ruim na pergunta é como você está testando o que fazer, usa a detecção de capacidade e não a detecção do navegador , a maneira como está fazendo isso ou muitas falhas e dores.

Respostas:

17

sim

Inferir a funcionalidade de uma sequência de agentes do usuário é um teste fraco e propenso a erros. Embora relativamente comum, hoje em dia eu diria que isso certamente é considerado uma má prática.

Por exemplo, jquery tem uma função para detectar qual navegador um usuário está usando e está obsoleto desde a versão 1.3

Portanto: não faça o farejamento do UserAgent para decidir o que é o navegador ou o que ele é capaz.

Melhor prática

A melhor prática aceita para lidar com as diferenças entre os recursos do navegador é usar a detecção de recursos .

Existem algumas bibliotecas disponíveis para isso, a mais conhecida é provavelmente: Modernizr . O Modernizr facilita a adaptação do seu javascript às habilidades de um navegador. Funciona detectando o que está disponível; não adivinhar com base em uma string UserAgent (exceto como último recurso de fallback) e simplesmente adicionar classes à tag html. Isso torna não apenas possível lidar facilmente com casos diferentes em seus js, mas também resolver certas deficiências apenas com o css. por exemplo (apenas para ilustração):

ul.menu {
    display:none;
}
ul.menu:hover {
    display:block;
}

# A touch device can have no hover - so show it always
html.notouch ul.menu {
    display: block;
}
AD7six
fonte
3

Tudo bem quando é JS válido e não há abstrações

Não é exatamente uma prática ruim, mesmo que tenha melhorado, os navegadores não são 100% idênticos.

Mas, antes de iniciar casos especiais, observe com atenção se são realmente casos especiais e não apenas idiossincrasias de outro navegador. Nesse caso, você deve procurar uma solução usando os padrões que todos os navegadores compartilham ( caniuse.com é de grande ajuda para isso).

Quando você tiver certeza de que é realmente específico do navegador, deve procurar se pode usar uma biblioteca que oculte esses detalhes. A compatibilidade entre navegadores é uma coisa difícil de acertar; portanto, se alguém fez isso por você, apenas lucre.

Como último recurso, faça o que você precisa fazer;)

keppla
fonte
2
+1 para bibliotecas. jQuery, Dojo, Prototype, Ext.js são apenas alguns exemplos.
pap
Sim. Eu estava relutante em adicionar recomendações, porque até agora eu apenas usei prototype e jquery, por isso sou muito tendencioso.
Keppla 16/05
2
NÃO está ok verificar o nome do navegador e executar um código diferente. Deixe claro que há uma diferença entre o browser sniffing e recurso sniffing
Raynos
Raynos, você está certo. Felizmente, a melhor resposta é a que aceita :)
keppla
2

Se por "fazer algumas coisas" você quer dizer "usar o recurso específico do IE x" e "fazer algumas outras coisas" você quer dizer "usar um recurso mais comum y", é uma prática recomendada apenas verificar a presença de x ou y.

Suponho que você não esteja usando nenhuma biblioteca Javascript externa. Nesse caso, eu verificaria se o jQuery suporta a tarefa que você está tentando realizar. Se isso acontecer, eu usaria.

Kevin Cline
fonte
1

Use os comentários específicos do IE <!--[if IE &gt; 6]>...ou algo assim. Funciona em todos os navegadores de baixa qualidade IE? -> IE8, mas não no IE9 +, que é considerado uma espécie de ok como navegador.

Resumindo, quando você lida com um navegador super ruim que precisa de soluções alternativas, não há problema em fazer o que for necessário, mas evitando transformar um código de linha de base bem escrito em um hackatron.

Felizmente, o IE desaparecerá um dia e você poderá excluir o código hackatron e deixar apenas a linha de base bem escrita.

Codificador
fonte
-1

Eu acho que é melhor adiar esse tipo de tomada de decisão para o designer de estrutura e usar uma estrutura JavaScript que encapsule esse tipo de complexidade. Hoje em dia, temos AngularJS, JQuery, ReactJS e assim por diante, fazer coisas sem uma estrutura levaria a você esse tipo de dificuldade.

YudhiWidyatama
fonte
Sua resposta não responde nada.
Andy
-2

Bem, supondo que você esteja realmente interessado em aprender JavaScript, a melhor prática é a seguinte: prefira testar pela ausência / existência de métodos e escreva funções de normalização. Um exemplo totalmente manco, mas atinge três princípios:

if(!document.getElementsByClassName){
    document.getByClass = function(){ //look at all elements, check for class etc...
}
else { document.getByClass = document.getElementsByClassName }
  1. Não cheire o navegador.
  2. Você também pode eliminar um pouco da sujeira do DOM à medida que avança. O objetivo da API do DOM é ser explícito, para não ficar mais fácil no seu túnel do carpo, se você não perceber como a JS é estranhamente flexível. O fator que quase não elimina é o que torna o exemplo coxo.
  3. Cache para uma nova função. Não faça o teste do método toda vez que for chamado.

A vantagem é que você nunca pode confiar 100% no farejamento do navegador e nunca sabe quando alguma outra biblioteca conectada na verdade não adicionou um método equivalente para você.

Se você está apenas tentando fazer as coisas ou quer aprender mais, recomendo o JQuery. Ele faz um trabalho estrondoso de eliminar o problema da API do DOM e manter um alto nível de normalização de plataforma cruzada, mas também é algo que você pode aprender bastante estudando sob o capô. Mais importante, se você se incomodar em continuar aprendendo realmente o JS principal, ele não se tornará inútil como muitas outras estruturas e bibliotecas JS e você continuará se beneficiando por poder desapossar seu lixo do JQuery com sua louca OOP-ish Habilidades.

Além disso, confira o site quirksmode.org para entender por que a Microsoft deve ser realmente desprezada por todos os IEs anteriores ao 9 na frente do JS e muitos detalhes detalhados sobre exatamente o que há de errado com sua API DOM proprietária e sugestões para contornar isso.

Erik Reppen
fonte
1
Estou um pouco confuso, você preferiria se eu não tivesse excluído esse comentário ofensivo? Da próxima vez que você tiver um problema com um comentário como esse, sinalize-o, em vez de morder a isca. Essa é uma boa resposta, mas está perdendo valor devido à sua grosseria (o mesmo com algumas de suas outras respostas). Apenas marque a porcaria e mantenha suas respostas profissionais, é tão fácil quanto isso.
Yannis 18/05/12
Sim, realmente. Eu sou enganado (provavelmente merecidamente) e meu comentário permanece. Por que o comentário irritante sobre a origem não deve permanecer também? É apenas a internet. As pessoas precisam lutar mais quando não há armas envolvidas.
Erik Reppen
1
Se você quiser lutar, leve-o para outro lugar, os programadores são uma plataforma de perguntas e respostas, que nos esforçamos para manter baixo ruído.
Yannis 18/05/12