Existe alguma diferença entre o código a seguir?
$('#whatever').on('click', function() {
/* your code here */
});
e
$('#whatever').click(function() {
/* your code here */
});
Eu acho que a diferença está nos padrões de uso.
Eu preferiria .on
mais .click
porque o primeiro pode usar menos memória e trabalho para elementos adicionados dinamicamente.
Considere o seguinte html:
<html>
<button id="add">Add new</button>
<div id="container">
<button class="alert">alert!</button>
</div>
</html>
onde adicionamos novos botões via
$("button#add").click(function() {
var html = "<button class='alert'>Alert!</button>";
$("button.alert:last").parent().append(html);
});
e quer "Alerta!" para mostrar um alerta. Podemos usar "clicar" ou "ativar" para isso.
click
$("button.alert").click(function() {
alert(1);
});
com o exposto acima, um manipulador separado é criado para cada elemento que corresponde ao seletor. Que significa
.on
$("div#container").on('click', 'button.alert', function() {
alert(1);
});
com o exposto, um único manipulador para todos os elementos que correspondem ao seu seletor, incluindo os criados dinamicamente.
.on
Como Adrien comentou abaixo, outro motivo para usar .on
são os eventos no espaço de nomes.
Se você adicionar um manipulador .on("click", handler)
normalmente, remova-o com o .off("click", handler)
qual removerá esse manipulador. Obviamente, isso funciona apenas se você tiver uma referência à função, e daí se não tiver? Você usa namespaces:
$("#element").on("click.someNamespace", function() { console.log("anonymous!"); });
com desenrolamento via
$("#element").off("click.someNamespace");
on('click' ...)
, consulte stackoverflow.com/a/3973060/759452, ie.on('click.darkenallothersections' ...)
e ao mesmo tempoon('click.displaynextstep' ...)
, então, posso desvincular apenas o que eu escolher usando.unbind('click.displaynextstep')
on()
é a tendência no jQuery. Eu tinha de atualização$(window).load(function() {});
para$(window).on("load", function (e) {})
quando eu atualizado para jQuery 3.Não, não há diferença funcional entre os dois exemplos de código na sua pergunta.
.click(fn)
é um "método de atalho" para.on("click", fn)
. A partir da documentação para.on()
:Observe que
.on()
difere de.click()
que ele tem a capacidade de criar manipuladores de eventos delegados passando umselector
parâmetro, enquanto.click()
que não. Quando.on()
é chamado sem umselector
parâmetro, ele se comporta exatamente da mesma forma que.click()
. Se você deseja delegação de eventos, use.on()
.fonte
selector
parâmetro. Se você ligar.on()
sem umselector
parâmetro, não haverá melhoria no desempenho sobre o uso.click()
..on()
é a maneira recomendada de fazer toda a associação de eventos a partir do jQuery 1.7. Ele rola toda a funcionalidade de ambos.bind()
e.live()
em uma função que altera o comportamento à medida que você passa parâmetros diferentes.Como você escreveu seu exemplo, não há diferença entre os dois. Ambos vinculam um manipulador ao
click
evento de#whatever
.on()
oferece flexibilidade adicional para permitir a delegação de eventos acionados por filhos#whatever
para uma única função de manipulador, se você escolher.fonte
.live()
faz? Além disso, isso parece contradizer as outras respostas que dizem que ele tem apenas a funcionalidade de.click()
e, portanto, não se aplica a eventos futuros..on()
pode fazer o que.click()
faz e fazer o que.bind()
e.live()
faz - depende de quais parâmetros você chama. (Algumas outras respostas mencionaram isso também.) Observe que "Vincular a todos os links dentro de # qualquer que seja" não é o que.live()
faz, é o que.delegate()
faz..live()
vincula a todos dentro, emdocument
vez de permitir que você especifique o contêiner. A nota também.live()
está obsoleta do jQuery 1.7 em diante.Conforme mencionado pelas outras respostas:
Observando, porém, que
.on()
suporta várias outras combinações de parâmetros que.click()
não, permitindo que ele lide com a delegação de eventos (substituindo.delegate()
e.live()
).(E, obviamente, existem outros métodos de atalho semelhantes para "keyup", "focus" etc.)
A razão pela qual estou postando uma resposta extra é mencionar o que acontece se você ligar
.click()
sem parâmetros:Observando que, se você usar
.trigger()
diretamente, também poderá passar parâmetros extras ou um objeto de evento jQuery, com o qual não poderá fazer isso.click()
.Eu também queria mencionar que, se você olhar o código-fonte do jQuery (em jquery-1.7.1.js), verá que internamente a função
.click()
(ou.keyup()
etc.) chamará.on()
ou.trigger()
. Obviamente, isso significa que você pode ter certeza de que eles realmente têm o mesmo resultado, mas também significa que o uso.click()
tem um pouco mais de sobrecarga - não há nada com o que se preocupar ou pensar na maioria das circunstâncias, mas teoricamente isso pode ser importante em circunstâncias extraordinárias.EDIT: Finalmente, observe que
.on()
permite vincular vários eventos à mesma função em uma linha, por exemplo:fonte
.click()
.)Não, não existe.
O ponto principal
on()
é suas outras sobrecargas e a capacidade de manipular eventos que não possuem métodos de atalho.fonte
Eles parecem ser os mesmos ... Documentação da função click () :
Documentação da função on () :
fonte
.click
vs.on
.click
eventos funcionam apenas quando o elemento é renderizado e são anexados apenas aos elementos carregados quando o DOM está pronto..on
eventos são anexados dinamicamente aos elementos DOM, o que é útil quando você deseja anexar um evento a elementos DOM que são renderizados em uma solicitação ajax ou outra coisa (depois que o DOM estiver pronto).fonte
Aqui você obterá uma lista de diferentes maneiras de aplicar o evento click. Você pode selecionar de acordo com sua qualidade ou, se o seu clique não estiver funcionando, tente uma alternativa.
fonte
Agora, eles preteriram click (), então é melhor continuar com ('click')
fonte
No que diz respeito à Internet e a alguns amigos, o .on () é usado quando você adiciona elementos dinamicamente. Mas quando eu o usei em uma página de login simples, onde o evento click deve enviar o AJAX para o node.js e, ao retornar, acrescentar novos elementos, ele começou a chamar chamadas multi-AJAX. Quando mudei para click () tudo deu certo. Na verdade, eu não enfrentei esse problema antes.
fonte
NOVOS ELEMENTOS
Como um adendo às respostas abrangentes acima, para destacar pontos críticos, se você quiser que o clique seja anexado a novos elementos:
fonte
$(document).on('click','.UPDATE',function(){ });
funciona efetivamente como os mesmos dados buscados usando o jquery. botão não funciona no momento da atualização ou exclusão:fonte