Estou usando o jQuery v.1.7.1, onde o método .live () é aparentemente obsoleto.
O problema que estou tendo é que, ao carregar dinamicamente o html em um elemento usando:
$('#parent').load("http://...");
Se eu tentar adicionar um evento de clique depois, ele não registrará o evento usando um destes métodos:
$('#parent').click(function() ...);
ou
// according to documentation this should be used instead of .live()
$('#child').on('click', function() ...);
Qual é a maneira correta de obter essa funcionalidade? Apenas parece funcionar com .live () para mim, mas eu não deveria estar usando esse método. Observe que #child é um elemento carregado dinamicamente.
Obrigado.
.live()
ele mostra como reescrever os usos existentes de.live()
usar.delegate()
ou.on()
(dependendo se você está na versão 1.7+ ou não). Observe, porém, que se você adicionar um manipulador com.click()
"depois", como você mencionou, ou seja, depois de carregar elementos dinamicamente, ele deverá funcionar - o único problema é tentar atribuir.click()
antes de carregar elementos dinamicamente.Respostas:
Se você deseja que o manipulador de cliques funcione para um elemento carregado dinamicamente, defina o manipulador de eventos em um objeto pai (que não seja carregado dinamicamente) e dê a ele um seletor que corresponda ao seu objeto dinâmico como este:
O manipulador de eventos será anexado ao
#parent
objeto e, sempre que um evento de clique aparecer na origem#child
, ele acionará o manipulador de cliques. Isso é chamado de manipulação de eventos delegados (a manipulação de eventos é delegada a um objeto pai).Isso é feito dessa maneira porque você pode anexar o evento ao
#parent
objeto, mesmo quando o#child
objeto ainda não existe, mas, quando ele existir mais tarde e for clicado, o evento click passará para o#parent
objeto, verá que ele foi originado#child
e existe um manipulador de eventos para clicar#child
e acionar seu evento.fonte
live()
vs.on()
mas esta noite eu decidi mais uma vez para tentar, e sua explicação revelou imediatamente que eu tinha faltado o tempo todo. Obrigado!mouseenter
emouseleave
eventos e teste dentro do manipulador qual foi desencadeada. O evento pseudo "pairar" do jQuery não está disponível com delegação.Tente o seguinte:
A partir da
$.on()
documentação:Seu
#child
elemento não existe quando você o chama$.on()
, portanto o evento não é vinculado (ao contrário$.live()
).#parent
, No entanto, faz existir, então a ligação do evento para que é bom.O segundo argumento no meu código acima funciona como um 'filtro' apenas gatilho se o evento borbulhava a
#parent
partir#child
.fonte
.load()
método - e não do código após o.load()
método.#child
só é conhecido por ser carregado quando o manipulador de sucesso realmente é executado e não antes.$(document).on('click', '.selector', function() { /* do stuff */ });
EDIT: Estou fornecendo um pouco mais de informações sobre como isso funciona, porque ... palavras. Com este exemplo, você está colocando um ouvinte em todo o documento.
Quando você
click
combina com qualquer elemento (s).selector
, o evento borbulha até o documento principal - desde que não haja outros ouvintes que chamamevent.stopPropagation()
método - que superariam a subida de um evento aos elementos pai.Em vez de vincular-se a um elemento ou conjunto de elementos específico, você está atendendo a eventos provenientes de elementos que correspondem ao seletor especificado. Isso significa que você pode criar um ouvinte, uma vez, que corresponderá automaticamente aos elementos existentes atualmente, bem como aos elementos adicionados dinamicamente.
Isso é inteligente por alguns motivos, incluindo desempenho e utilização de memória (em aplicativos de grande escala)
EDITAR:
Obviamente, o elemento pai mais próximo que você pode ouvir é melhor, e você pode usar qualquer elemento no lugar
document
, desde que os filhos para os quais deseja monitorar eventos estejam dentro desse elemento pai ... mas isso realmente não tem nada a ver com a pergunta.fonte
$(element).on(...)
. Isto é$(document).on(...,element,...)
. Bestas diferentes.O equivalente a .live () em 1.7 é assim:
Basicamente, assista ao documento para eventos de clique e filtre-os para #child.
fonte
.live()
)..live()
foi descontinuado agora é porque é ruim colocar todos os manipuladores de eventos ao vivo no objeto de documento. As coisas podem muito, muito devagar. Não apenas os eventos precisam chegar até o documento, mas você pode ter muitos manipuladores de eventos para examinar o objeto do documento. A principal vantagem.on()
é que você pode anexá-lo a um objeto pai muito mais próximo do objeto real e melhorar drasticamente o desempenho. Então ... eu não recomendaria o uso.on()
com o objeto de documento. Muito melhor escolher um objeto pai mais próximo..live()
abordagem; no entanto, a capacidade de controlar a delegação é certamente vantajosa.Eu sei que é um pouco tarde para uma resposta, mas eu criei um polyfill para o método .live (). Eu testei no jQuery 1.11 e parece funcionar muito bem. Eu sei que devemos implementar o método .on () sempre que possível, mas em grandes projetos, onde não é possível converter todas as chamadas .live () para as chamadas equivalentes .on () por qualquer motivo, o seguinte pode trabalhos:
Basta incluí-lo depois de carregar o jQuery e antes de ligar para live ().
fonte
.on () é para o jQuery versão 1.7 e superior. Se você possui uma versão mais antiga, use o seguinte:
fonte
.delegate()
desempenho é muito melhor do.live()
que o motivo pelo qual o documento do jQuery recomenda e desaprova.live()
. Sim,.live()
ainda funciona, mas as respostas aqui no SO devem recomendar a melhor maneira de fazer as coisas. Eu já vi isso 20 vezes aqui no SO. Se você postar o código.live()
aqui no SO, ele será votado novamente (normalmente não por mim, a menos que haja algo mais errado com ele)..live()
definitivamente funcione mesmo na versão 1.7, você ainda deve usar.delegate()
ou.on()
porque.live()
foi preterido por um bom motivo. Contanto que você observe a alteração na sintaxe das duas funções mais recentes, elas funcionarão bem.Eu usei 'live' no meu projeto, mas um amigo sugeriu que eu deveria usar 'on' em vez de live. E quando tentei usar isso, tive um problema como você.
Nas minhas páginas, crio linhas de tabelas de botões e muitas coisas dinamicamente. mas quando eu uso a magia desapareceu.
As outras soluções, como usá-lo como uma criança, apenas chamam suas funções todas as vezes a cada clique. Mas eu acho uma maneira de fazer isso acontecer novamente e aqui está a solução.
Escreva seu código como:
Chamador (); depois de criar seu objeto na página assim.
Dessa forma, sua função é chamada quando é suposto que nem todos os cliques na página.
fonte