Front End

22 mar, 2010

jQuery – método $.live();

Publicidade

Falaremos sobre um método do jQuery muito útil,
muito mesmo. Mais informações em inglês pode ser
encontrada na documentação oficial
do método .live()
.

O problema

É muito comum, quando estamos desenvolvendo aplicações para Internet, precisarmos criar ferramentas tão dinâmicas que acabamos por utilizar
quase todo o potencial que o JavaScript dispõe a
oferecer. Nas ferramentas que desenvolvo é muito comum a interface da
ferramenta ser controlada e alterada quase que o tempo todo através da
manipulacão do DOM e muitas vezes precisamos anexar comportamentos em um determinado elemento da página.

Por exemplo: temos um sistema de comentários onde
todos os comentários são carregados e as respostas destes comentários
aparecem como árvore.

  • Comentário 1
  • Comentário 2
    • Resposta do comentário 2
      • Resposta da resposta do comentário 2
  • Comentário 3

E assim vai

Eu posso responder em tempo real um comentário e ele ja vai aparecer
para mim. Tudo via jQuery. Quando fazemos uma varredura
no DOM do documento usando os seletores do jQuery,
procuramos por todos os botões que tenham a classe “responder”, que
originalmente ficam sem ação e depois, via jQuery, damos ação ao
elemento.

$('.responder').bind('click', function() {
// instruções
});

Neste ponto, temos um problema. O índice de elementos do jQuery é
estático, ele não atualiza automaticamente. Se um novo botão responder
surgir na tela o jQuery não surtirá efeito sobre ele, pois ele apareceu
DEPOIS da primeira varredura no DOM, quando eu usei o seletor
$(‘.responder’).

Solução

Para corrigir este problema, podemos utilizar o .live() do jQuery.
Independente de quando e da quantidade de botões que surgirem na tela o
jQuery irá acrescenta-lo em seu índice e você poderá manipula-lo da
forma como quiser.

$('.responder').live('click', function() {
// instruções
});

Caso queira adicionar ao DOM o mesmo comportamento em mais de um
evento, basta fazer o seguinte:

$('.responder').live('mouseover mouseout', function(event) {
if (event.type == 'mouseover') {
// faça isso
} else {
// faça aquilo
}
});

Ou crie 2 lives separadamente para cada evento.

$('.responder').live('mouseover', function() {
// instruções
});
$('.responder').live('mouseout', function() {
// instruções
});

A princípio o conceito pode ser um pouco confuso. Fica difícil de
entender isso quando nunca se passou pelo problema. O dia que algo não
funcionar como o esperado pelo jQuery, nem simplesmente ter sido chamado,
lembre-se do $.live();