Pesquisa de site

javascript - armadilhas do jQuery a evitar


Estou começando um projeto com jQuery.

Quais armadilhas/erros/concepções erradas/abusos/usos indevidos você teve em seu projeto jQuery?

Resposta #1

Estar alheio à queda de desempenho e usar excessivamente seletores em vez de atribuí-los a variáveis locais. Por exemplo:-

$('#button').click(function() {
    $('#label').method();
    $('#label').method2();
    $('#label').css('background-color', 'red');
});

Ao invés de:-

$('#button').click(function() {
    var $label = $('#label');
    $label.method();
    $label.method2();
    $label.css('background-color', 'red');
});

Ou ainda melhor com encadeamento:-

$('#button').click(function() {
    $("#label").method().method2().css("background-color", "red"); 
});

Eu encontrei este momento esclarecedor quando percebi como as pilhas de chamadas funcionam.

Editar: incorporadas as sugestões nos comentários.

Resposta #2

Entenda como usar o contexto. Normalmente, um seletor jQuery vai pesquisar todo o documento:

// This will search whole doc for elements with class myClass
$('.myClass');

Mas você pode acelerar as coisas procurando dentro de um contexto:

var ct = $('#myContainer');
// This will search for elements with class myClass within the myContainer child elements
$('.myClass', ct);

Resposta #3

Não use seletores de classe simples, assim:

$('.button').click(function() { /* do something */ });

Isso acabará examinando cada elemento para ver se ele tem uma classe de "button".

Em vez disso, você pode ajudá-lo, assim:

$('span.button').click(function() { /* do something */ });
$('#userform .button').click(function() { /* do something */ });

Aprendi isso no ano passado no blog da Rebecca Murphy

Atualização - Esta resposta foi dada há mais de 2 anos e não está correta para a versão atual do jQuery. Um dos comentários inclui um teste para provar isso. Há também uma versão atualizada do teste que inclui a versão do jQuery na época desta resposta.

Resposta #4

Tente separar funções anônimas para que você possa reutilizá-las.

//Avoid
$('#div').click( function(){
   //do something
});

//Do do
function divClickFn (){
   //do something    
}

$('#div').click( divClickFn );

Resposta #5

Ao usar a função $.ajax para requisições Ajax ao servidor, você deve evitar usar o evento completo para processar dados de resposta. Ele disparará independentemente de o pedido ter sido bem-sucedido ou não.

Em vez de complete, use success.

Veja os Eventos Ajax na documentação.

Resposta #6

  • Evite abusar do document ready.
  • Mantenha o documento pronto apenas para inicializar o código.
  • Sempre extraia funções fora do doc ready para que possam ser reutilizadas.

Eu já vi centenas de linhas de código dentro da declaração doc ready. Feio, ilegível e impossível de manter.

Resposta #7

Encadeando eventos de animação com callbacks.

Suponha que você queira animar um parágrafo desaparecendo ao clicá-lo. Você também quer remover o elemento do DOM depois. Você pode pensar que pode simplesmente encadear os métodos:

$("p").click(function(e) {
  $(this).fadeOut("slow").remove();
});

Neste exemplo, .remove() será chamado antes que .fadeOut() seja concluído, destruindo seu efeito de desvanecimento gradual e simplesmente fazendo o elemento desaparecer instantaneamente. Em vez disso, quando quiser disparar um comando apenas após terminar o anterior, use os callbacks:

$("p").click(function(e){
  $(this).fadeOut("slow", function(){
    $(this).remove();
  });
});

O segundo parâmetro de .fadeOut() é uma função anônima que será executada assim que a animação .fadeOut() for concluída. Isso proporciona um desvanecimento gradual e a subsequente remoção do elemento.

Resposta #8

Se você usar bind() no mesmo evento várias vezes, ele será acionado várias vezes. Eu geralmente sempre faço unbind('click').bind('click') só para garantir

Resposta #9

Armagem: Usar loops em vez de seletores.

Se você se pegar usando o método jQuery '.each' para iterar sobre elementos DOM, pergunte a si mesmo se pode usar um seletor para obter os elementos em vez disso.

Mais informações sobre seletores jQuery:
http://docs.jquery.com/Selectors

Armando: NÃO usar uma ferramenta como o Firebug

Firebug foi praticamente feito para esse tipo de depuração. Se você vai ficar mexendo no DOM com Javascript, precisa de uma boa ferramenta como o Firebug para ter visibilidade.

Mais informações sobre o Firebug: http://getfirebug.com/

Outras ótimas ideias estão neste episódio do Polymorphic Podcast: (Segredos do jQuery com Dave Ward) http://polymorphicpodcast.com/shows/jquery/

Resposta #10

Não abuse dos plug-ins.

Na maioria das vezes, você precisará apenas da biblioteca e talvez da interface do usuário. Se você mantiver simples, seu código será fácil de manter a longo prazo. Nem todos os plug-ins são suportados e mantidos, na verdade a maioria não é. Se você puder imitar a funcionalidade usando os elementos principais, eu recomendo fortemente.

Plug-ins são fáceis de inserir no seu código, economizam tempo, mas quando você precisar de algo extra, não é boa ideia modificá-los, pois você perde as possíveis atualizações. O tempo que você economiza no começo, vai perder depois ao trocar plug-ins obsoletos.

Escolha os plug-ins que você usa com sabedoria. Além da biblioteca e da interface do usuário, eu uso constantemente $.cookie, $.form, $.validate e thickbox. Para o resto, eu geralmente desenvolvo meus próprios plug-ins.

Resposta #11

Mal-entendido sobre o uso deste identificador no contexto correto. Por exemplo:

$( "#first_element").click( function( event)
{
   $(this).method( ); //referring to first_element
   $(".listOfElements").each( function()
   {
      $(this).someMethod( ); // here 'this' is not referring first_element anymore.
   })
});

E aqui está uma das amostras de como você pode resolvê-lo:

$( "#first_element").click( function( event)
{
   $(this).method( ); //referring to first_element
   var $that = this;
   $(".listOfElements").each( function()
   {
      $that.someMethod( ); // here 'that' is referring to first_element still.
   })
});

Resposta #12

Evite pesquisar por todo o DOM várias vezes. Isso é algo que realmente pode atrasar seu script.

Ruim :

$(".aclass").this();
$(".aclass").that();
...

Bom :

$(".aclass").this().that();

Ruim :

$("#form .text").this();
$("#form .int").that();
$("#form .choice").method();

Bom :

$("#form")
    .find(".text").this().end()
    .find(".int").that().end()
    .find(".choice").method();

Resposta #13

Sempre armazene em cache $ (isso) em uma variável significativa, especialmente em um .each()

Como isto

$(selector).each(function () {
    var eachOf_X_loop = $(this); 
})

Resposta #14

Semelhante ao que Repo Man disse, mas não exatamente.

Ao desenvolver winforms em ASP.NET, eu frequentemente faço

$('<%= Label1.ClientID %>');

esquecendo o sinal #. A forma correta é

$('#<%= Label1.ClientID %>');

Resposta #15

Eventos

$("selector").html($("another-selector").html());

não clona nenhum dos eventos - você precisa reatribuir todos eles.

De acordo com a recomendação do JP- clone() revincula os eventos se você passar em true.

Artigos relacionados