No jQuery v1.7, um novo método on
foi adicionado. A partir da documentação:
'O método .on () anexa manipuladores de eventos ao conjunto de elementos atualmente selecionado no objeto jQuery. A partir do jQuery 1.7, o método .on () fornece toda a funcionalidade necessária para anexar manipuladores de eventos. '
Qual a diferença com live
e bind
?
Respostas:
on()
é uma tentativa de mesclar a maioria das funções de ligação de eventos do jQuery em uma. Isto tem a vantagem adicional de arrumar as ineficiências comlive
vsdelegate
. Nas versões futuras do jQuery, esses métodos serão removidos e somenteon
eone
serão deixados.Exemplos:
Internamente, o jQuery mapeia todos esses métodos e configuradores de manipuladores de eventos abreviados para o
on()
método, indicando ainda que você deve ignorar esses métodos a partir de agora e apenas usaron
:Consulte https://github.com/jquery/jquery/blob/1.7/src/event.js#L965 .
fonte
$(document.body).delegate("click", ".mySelector", fn);
deve ser$(document.body).delegate(".mySelector", "click", fn);
on
está na natureza muito pertodelegate
. Então, por que não usar delegado? É porqueon
não vem sozinho. existeoff
, para desassociar um evento eone
criar um evento para ser executado apenas uma vez. Este é o "pacote" de um novo evento.O principal problema
live
é que ele é anexado à "janela", forçando um evento de clique (ou outro evento) em um elemento dentro da estrutura da página (o dom), a "borbulhar" na parte superior da página para encontrar um evento manipulador disposto a lidar com isso. Em cada nível, todos os manipuladores de eventos precisam ser verificados, isso pode aumentar rapidamente, se você fizer uma imbricação profunda (<body><div><div><div><div><table><table><tbody><tr><td><div><div><div><ul><li><button> etc etc etc...
)Assim,
bind
assimclick
como outros ligadores de eventos de atalho se conectam diretamente ao destino do evento. Se você possui uma tabela de, digamos, 1000 linhas e 100 colunas, e cada uma das 100.000 células inclui uma caixa de seleção com o clique que você deseja manipular. Anexar 100'000 manipuladores de eventos levará muito tempo no carregamento da página. Criar um único evento no nível da tabela e usar a delegação de eventos é várias ordens de magnitude mais eficientes. O destino do evento será recuperado no momento da execução do evento. "this
" será a tabela, mas "event.target
" será o habitual "this
" em umaclick
função. Agora, o mais interessanteon
é que "this
" sempre será o destino do evento, e não o contêiner ao qual está anexado.fonte
com o
.on
método é possível fazer.live
,.delegate
e.bind
com a mesma função, mas.live()
apenas com.live()
é possível (delegar eventos ao documento).jQuery("#example").bind( "click", fn )
=jQuery( "#example").on( "click", fn );
jQuery("#example").delegate( ".examples", "click", fn )
=jQuery( "#example" ).on( "click", ".examples", fn )
jQuery("#example").live( fn )
=jQuery( document ).on( "click", "#example", fn )
Posso confirmar isso diretamente da fonte jQuery:
jQuery (this.context)?
this.context
===document
na maioria dos casosfonte
(Minha frase de abertura fazia mais sentido antes de você mudar a pergunta. Originalmente você disse "Qual é a diferença
live
?")on
é maisdelegate
do que élive
, é basicamente uma forma unificada de (bind
edelegate
, de fato, a equipe disse que seu objetivo é "... unificar todas as formas de anexar eventos a um documento ..." ).live
é basicamenteon
(oudelegate
) anexado ao documento como um todo. Foi descontinuado a partir da v1.7 em favor do uso deon
oudelegate
. No futuro, suspeito que veremos o código usandoon
apenas, e não usandobind
oudelegate
(oulive
) ...Portanto, na prática, você pode:
Use
on
comobind
:Use
on
likedelegate
(delegação de evento enraizada em um determinado elemento):Use
on
likelive
(delegação de evento enraizada no documento):fonte
on
é uma combinação debind
edelegate
, como eu disse, não muito parecidolive
. Você pode usaron
comobind
(anexar um manipulador diretamente a um elemento) ouon
comodelegate
(anexar um manipulador a um elemento), mas acionar o evento apenas se o elemento real clicado corresponder a um seletor e como se esse elemento fosse o evento aconteceu em - por exemplo, delegação de eventos) ou você pode usá-lo comolive
(delegate
usando o documento como raiz). É a delegação de eventos que a torna útil se você estiver adicionando elementos dinamicamente.$("#id", ".class").live(fn)
=$(".class").delegate("#id", fn );
Na verdade, na fonte antiga do jQuery, eles usavam live como caso geral e delegado como caso especial, o que tornava isso ainda mais confuso quando você pensa sobre isso.delegate
rapidamente, mas ainda assim. :-)live é o atalho para .on () agora
também este post pode ser útil para você http://blog.jquery.com/2011/11/03/jquery-1-7-released/
fonte
Não existe um para o caso de uso básico. Essas duas linhas são funcionalmente iguais
.on () também pode delegar eventos e é preferido.
.bind () é atualmente apenas um alias para .on () agora. Aqui está a definição da função de ligação na 1.7.1
A idéia para adicionar .on () era criar uma API de evento unificado, em vez de ter várias funções para evento de ligação; .on () substitui .bind (), .live () e .delegate ().
fonte
Algo que você deve estar ciente se desejar associar os manipuladores de eventos ao elemento - preste atenção a qual elemento o manipulador foi anexado!
Por exemplo, se você usar:
você receberá os manipuladores de eventos usando:
Mas se você usar:
você receberá os manipuladores de eventos usando:
(no último caso, o objeto de evento relevante terá selector = ". mySelector")
fonte
events
não é documentado de qualquer maneira e eu acho que não funciona mais em 1.9