Antes de ler isso, puxe esta lista de eventos para outra página, a própria API é tremendamente útil e tudo o que estou discutindo abaixo está vinculado diretamente a esta página .
Primeiro, .click(function)
é literalmente um atalho para .bind('click', function)
, eles são equivalentes. Use-os ao vincular um manipulador diretamente a um elemento , assim:
$(document).click(function() {
alert("You clicked somewhere in the page, it bubbled to document");
});
Se esse elemento for substituído ou jogado fora, esse manipulador não estará mais lá. Também os elementos que não estavam presentes quando esse código foi executado para anexar o manipulador (por exemplo, o seletor o encontrou) não receberão o manipulador.
.live()
e .delegate()
são parecidos, .delegate()
na verdade usam .live()
internamente; ambos escutam os eventos borbulharem. Isso funciona para elementos novos e antigos , eles exibem eventos da mesma maneira. Você os usa quando seus elementos podem mudar, por exemplo, adicionando novas linhas, itens de lista, etc. Se você não possui um ancestral pai / comum que permanecerá na página e não será substituído a qualquer momento, use o .live()
seguinte:
$(".clickAlert").live('click', function() {
alert("A click happened");
});
Se, no entanto, você tiver um elemento pai em algum lugar que não está sendo substituído (para que seus manipuladores de eventos não estejam se despedindo), você deve lidar com .delegate()
isso da seguinte maneira:
$("#commonParent").delegate('.clickAlert', 'click', function() {
alert("A click happened, it was captured at #commonParent and this alert ran");
});
Isso funciona quase da mesma forma que .live()
, mas o evento borbulha menos vezes antes de ser capturado e os manipuladores executados. Outro uso comum de ambos é dizer que sua classe é alterada em um elemento, não correspondendo mais ao seletor usado originalmente ... com esses métodos, o seletor é avaliado no momento do evento , se corresponder, o manipulador será executado. .são o elemento que não corresponde mais ao seletor importa, ele não será mais executado. No .click()
entanto, o manipulador de eventos é vinculado diretamente ao elemento DOM, o fato de não corresponder a qualquer seletor usado para encontrá-lo é irrelevante ... o evento é vinculado e permanece até o elemento desaparecer, ou o manipulador é removido via .unbind()
.
Outro uso comum para .live()
e .delegate()
é o desempenho . Se você estiver lidando com muitos elementos, anexar um manipulador de cliques diretamente a cada elemento é caro e demorado. Nesses casos, é mais econômico configurar um único manipulador e deixar que o bubbling faça o trabalho, dê uma olhada nesta pergunta em que fez uma enorme diferença , é um bom exemplo da aplicação.
Disparo - para a pergunta atualizada
Existem duas funções principais de acionador de manipulador de eventos disponíveis, elas se enquadram na mesma categoria "Anexo de manipulador de eventos" na API , são .trigger()
e .triggerHandler()
. .trigger('eventName')
possui alguns atalhos internos para os eventos comuns, por exemplo:
$().click(fn); //binds an event handler to the click event
$().click(); //fires all click event handlers for this element, in order bound
Você pode ver uma lista incluindo esses atalhos aqui .
Quanto à diferença, .trigger()
aciona o manipulador de eventos (mas não a ação padrão na maioria das vezes, por exemplo, colocando o cursor no ponto certo em um clique <textarea>
). Isso faz com que os manipuladores de eventos ocorram na ordem em que foram vinculados (como seria o evento nativo), aciona as ações do evento nativo e borbulha o DOM.
.triggerHandler()
geralmente é para um propósito diferente, aqui você está apenas tentando disparar o (s) manipulador (es) vinculado (s), não causa o disparo do evento nativo, por exemplo, enviando um formulário. Ele não faz bolhas no DOM e não pode ser encadeado (ele retorna o que o último manipulador de eventos associado a esse evento retornar). Por exemplo, se você deseja acionar um focus
evento, mas não focar o objeto, apenas deseja .focus(fn)
executar o código vinculado , isso faria isso, enquanto o .trigger()
faria, além de focar o elemento e fazer bolhas.
Aqui está um exemplo do mundo real:
$("form").submit(); //actually calling `.trigger('submit');`
Isso executaria quaisquer manipuladores de envio, por exemplo, o plug-in de validação do jQuery e tentaria enviar o <form>
. No entanto, se você apenas deseja validar, uma vez que é conectado por meio de um submit
manipulador de eventos, mas não o envia <form>
posteriormente, você pode usar o .triggerHandler('submit')
seguinte:
$("form").triggerHandler('submit');
O plug-in impede que o manipulador envie o formulário bombardeando se a verificação de validação não for aprovada, mas com esse método não nos importamos com o que faz. Independentemente de ter sido anulado ou não, não estamos tentando enviar o formulário, só queremos acioná-lo para re-validar e não fazer mais nada. ( Isenção de responsabilidade: este é um exemplo supérfluo, pois existe um .validate()
método no plug-in, mas é uma ilustração decente da intenção)