Pergunta

Eu tenho alguns elementos <tr> na minha página com um evento click() anexado a uma imagem que fica dentro de cada um. Eu uso este código

$(this).clone(true).appendTo("table#foo");

para fazer o seguinte:

  • copiar esses <tr>s em uma tabela diferente
  • preservar os eventos, clique nas imagens no interior dos <tr>s (por causa do argumento true)

Tudo isso funciona bem. Agora eu adicionei um jQuery Ouça evento para aqueles <tr>s, de modo que um usuário não tem para apontar com precisão:. ele / ela pode clicar em qualquer lugar na <tr> e eu posso passar o clique para a imagem

É codificado como este:

$('tr.record').listen('click','td',function(){
  $(this).parent().find("img.clickable").click();
});

O listen () evento funciona bem no item original, mas evento no item clonado, a ouvir () falhar. clique evento A imagem do ainda funciona bem.

Aqui está o Firebug diz-me:

m(this, e.type) is undefined

... e ele faz referência a linha 9 de jquery.listen-1.0.3-min.js.

Como posso pode fazer o trabalho evento listen () sobre os elementos clonados?

Atualização

Por padrão, jQuery não copia eventos em elementos clonados, mas este plugin é feito para fazer isso.

Enquanto isso, o autor do listen () plug-in sugeriu uma estratégia diferente - veja minha resposta abaixo

.
Foi útil?

Solução

Ariel Flesler, criador do plugin listen (), me deu este conselho via e-mail:

"Eu acho que isso pode ser resolvido de outra maneira. A idéia de Listen (e delegação de evento) é realmente evitar toda a cópia de eventos para novos elementos ".

"Você poderia simplesmente fazer:"

$('table#foo').listen('click','td',function(){
 $(this).parent().find("img.clickable").click();
});

"Ou ainda:"

$.listen('click','td',function(){
 $(this).parent().find("img.clickable").click();
});

"O primeiro exemplo vai usar a tabela como ouvinte. No 2º um, o tag <html> é usado. Portanto, não importa se você adicionar novos td / tr / tabelas. ele vai ainda funcionam. "

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top