A partir do jQuery 1.7, você deve usar jQuery.fn.on
:
$(staticAncestors).on(eventName, dynamicChild, function() {});
Antes disso , a abordagem recomendada era usar live()
:
$(selector).live( eventName, function(){} );
No entanto, live()
foi preterido em 1,7 a favor on()
e completamente removido em 1,9. A live()
assinatura:
$(selector).live( eventName, function(){} );
... pode ser substituído pela seguinte on()
assinatura:
$(document).on( eventName, selector, function(){} );
Por exemplo, se sua página estava criando dinamicamente elementos com o nome da classe, dosomething
você vincularia o evento a um pai que já existe (este é o ponto principal do problema aqui, você precisará de algo que exista para se conectar, não vincule ao conteúdo dinâmico), pode ser (e a opção mais fácil) é document
. Embora tenha em mente que document
pode não ser a opção mais eficiente .
$(document).on('mouseover mouseout', '.dosomething', function(){
// what you want to happen when mouseover and mouseout
// occurs on elements that match '.dosomething'
});
Qualquer pai que exista no momento em que o evento está vinculado é bom. Por exemplo
$('.buttons').on('click', 'button', function(){
// do something here
});
se aplicaria a
<div class="buttons">
<!-- <button>s that are generated dynamically and added here -->
</div>
Há uma boa explicação na documentação de
jQuery.fn.on
.Em resumo:
Portanto, no exemplo a seguir
#dataTable tbody tr
deve existir antes que o código seja gerado.Se um novo HTML estiver sendo injetado na página, é preferível usar eventos delegados para anexar um manipulador de eventos, conforme descrito a seguir.
Eventos delegados têm a vantagem de poder processar eventos de elementos descendentes que são adicionados ao documento posteriormente. Por exemplo, se a tabela existir, mas as linhas forem adicionadas dinamicamente usando o código, o seguinte será tratado:
Além de sua capacidade de manipular eventos em elementos descendentes que ainda não foram criados, outra vantagem dos eventos delegados é seu potencial de sobrecarga muito menor quando muitos elementos devem ser monitorados. Em uma tabela de dados com 1.000 linhas
tbody
, o primeiro exemplo de código anexa um manipulador a 1.000 elementos.Uma abordagem de eventos delegados (o segundo exemplo de código) anexa um manipulador de eventos a apenas um elemento, oe
tbody
o evento precisa apenas aumentar um nível (de clicadotr
paratbody
).Nota: Eventos delegados não funcionam para SVG .
fonte
tr
para um seletor apropriado, como'input[type=checkbox]'
, e isso seria tratado automaticamente para as linhas recém-inseridas?Esta é uma solução JavaScript pura , sem bibliotecas ou plugins:
onde
hasClass
estaLive demo
O crédito é para Dave e Sime Vidas
Utilizando JS mais moderno,
hasClass
pode ser implementado como:fonte
Element.classList
não é suportado em navegadores antigos. Por exemplo, o IE <9.Você pode adicionar eventos aos objetos ao criá-los. Se você estiver adicionando os mesmos eventos a vários objetos em momentos diferentes, a criação de uma função nomeada pode ser o caminho a seguir.
fonte
Você pode simplesmente agrupar sua chamada de ligação de evento em uma função e depois invocá-la duas vezes: uma vez no documento pronto e uma vez após o seu evento que adiciona os novos elementos DOM. Se você fizer isso, evite associar o mesmo evento duas vezes aos elementos existentes, para desassociar os eventos existentes ou (melhor) vincular apenas aos elementos DOM que foram criados recentemente. O código ficaria assim:
fonte
Tente usar em
.live()
vez de.bind()
; ele.live()
será vinculado.hover
à sua caixa de seleção após a execução da solicitação do Ajax.fonte
live()
foi preterido na versão 1.7 em favoron
e excluído na versão 1.9.Ligação de evento em elementos criados dinamicamente
Elemento único:
Elemento filho:
Observe o adicionado
*
. Um evento será acionado para todos os filhos desse elemento.Eu notei que:
Não está mais funcionando, mas estava funcionando antes. Estou usando o jQuery do Google CDN , mas não sei se eles foram alterados.
fonte
Você pode usar o método live () para vincular elementos (mesmo os recém-criados) a eventos e manipuladores, como o evento onclick.
Aqui está um código de exemplo que eu escrevi, onde você pode ver como o método live () liga elementos escolhidos, mesmo os recém-criados, a eventos:
fonte
Prefiro usar o seletor e aplicá-lo no documento.
Isso se liga ao documento e será aplicável aos elementos que serão renderizados após o carregamento da página.
Por exemplo:
fonte
selector
variável, quando se deve ou conter uma cadeia ou elemento de objeto que você pode apenas passar diretamente para que o argumento deon()
Outra solução é adicionar o ouvinte ao criar o elemento. Em vez de colocar o ouvinte no corpo, você o coloca no elemento no momento em que o cria:
fonte
myElement.append('body');
deve sermyElement.appendTo('body');
. Por outro lado, se não houver necessidade de um maior uso de variávelmyElement
é mais fácil e mais curto desta maneira:$('body').append($('<button/>', { text: 'Go to Google!' }).bind( 'click', goToGoogle));
Tente assim -
fonte
Observe a classe "MAIN" em que o elemento é colocado, por exemplo,
No cenário acima, o objeto PRINCIPAL que o jQuery observará é "contêiner".
Então você tem basicamente elementos nomes sob recipiente, como
ul
,li
, eselect
:fonte
Isso é feito pela delegação de eventos . O evento será vinculado ao elemento da classe wrapper, mas será delegado ao elemento da classe seletor. É assim que funciona.
Nota:
O elemento wrapper-class pode ser qualquer coisa ex. documento, corpo ou seu invólucro. O wrapper já deve existir . No entanto,
selector
não precisa necessariamente ser apresentado no momento do carregamento da página. Pode ocorrer mais tarde e o evento será vinculadoselector
sem falhas .fonte
você poderia usar
ou
esses dois métodos são equivalentes, mas têm uma ordem diferente de parâmetros.
veja: jQuery Delegate Event
fonte
delegate()
agora está obsoleto. Não use isso.Você pode anexar um evento ao elemento quando criado dinamicamente usando
jQuery(html, attributes)
.fonte
Eis por que os elementos criados dinamicamente não respondem aos cliques:
Como solução alternativa, você deve ouvir todos os cliques e verificar o elemento de origem:
Isso é chamado de "Delegação de Eventos". Boas notícias, é um recurso interno do jQuery :-)
fonte
Qualquer coisa que exista no momento em que o evento é vinculado e se sua página estava criando dinamicamente elementos com o botão de nome de classe , você vincularia o evento a um pai que já existe
fonte
Vincule o evento a um pai que já existe:
fonte
Use o
.on()
método do jQuery http://api.jquery.com/on/ para anexar manipuladores de eventos ao elemento live.Também a partir da versão 1.9, o
.live()
método é removido.fonte
Prefiro que os ouvintes de eventos sejam implantados de forma modular, em vez de criar scripts para um
document
ouvinte de nível. Então, eu gosto abaixo. Observe que você não pode assinar em excesso um elemento com o mesmo ouvinte de evento; portanto, não se preocupe em anexar um ouvinte mais de uma vez - apenas um fica.fonte
Outra solução flexível para criar elementos e vincular eventos ( origem )
Nota: Isso criará uma instância do manipulador de eventos para cada elemento (pode afetar o desempenho quando usado em loops)
fonte
fonte
Eu estava procurando uma solução para começar
$.bind
e$.unbind
trabalhar sem problemas em elementos adicionados dinamicamente.Como on () faz o truque para anexar eventos, a fim de criar um desatamento falso dos que eu vim:
fonte