Dans jQuery v1.7, une nouvelle méthode a on
été ajoutée. De la documentation:
'La méthode .on () attache des gestionnaires d'événements à l'ensemble d'éléments actuellement sélectionné dans l'objet jQuery. Depuis jQuery 1.7, la méthode .on () fournit toutes les fonctionnalités requises pour attacher des gestionnaires d'événements. '
Quelle est la différence avec live
et bind
?
Réponses:
on()
est une tentative de fusionner la plupart des fonctions de liaison d'événements de jQuery en une seule. Cela a l'avantage supplémentaire de rangement de l'inefficacité aveclive
vsdelegate
. Dans les futures versions de jQuery, ces méthodes seront supprimées et seulementon
etone
resteront.Exemples:
En interne, jQuery mappe toutes ces méthodes et les setters de gestionnaire d'événements abrégés à la
on()
méthode, indiquant en outre que vous devez désormais ignorer ces méthodes et utiliser simplementon
:Voir https://github.com/jquery/jquery/blob/1.7/src/event.js#L965 .
la source
$(document.body).delegate("click", ".mySelector", fn);
devrait être$(document.body).delegate(".mySelector", "click", fn);
on
est dans la nature très proche dedelegate
. Alors pourquoi ne pas utiliser le délégué? C'est parce queon
ça ne vient pas seul. il y aoff
, pour dissocier l'événement etone
pour créer un événement à exécuter une seule fois. Il s'agit du "package" d'un nouvel événement.Le principal problème de
live
est qu'il s'attache à "window", forçant un événement de clic (ou un autre événement) sur un élément au plus profond de la structure de la page (le dom), à "remonter" en haut de la page pour trouver un événement gestionnaire disposé à y faire face. À chaque niveau, tous les gestionnaires d'événements doivent être vérifiés, cela peut s'additionner rapidement, si vous faites une imbrication profonde (<body><div><div><div><div><table><table><tbody><tr><td><div><div><div><ul><li><button> etc etc etc...
)Alors,
bind
commeclick
, comme les autres classeurs d'événements de raccourci se fixent directement sur la cible de l' événement. Si vous avez un tableau de, disons, 1000 lignes et 100 colonnes, et chacune des 100'000 cellules comprend une case à cocher que vous souhaitez gérer. Joindre 100'000 gestionnaires d'événements prendra beaucoup de temps lors du chargement de la page. La création d'un seul événement au niveau de la table et l'utilisation de la délégation d'événements sont plusieurs ordres de grandeur plus efficaces. La cible de l'événement sera récupérée au moment de l'exécution de l'événement. "this
" sera la table, mais "event.target
" sera votre "this
" habituel dans uneclick
fonction. Maintenant, ce quion
est bien avec, c'est que "this
" sera toujours la cible de l'événement, et non le conteneur auquel il est attaché.la source
avec la
.on
méthode il est possible de faire.live
,.delegate
et.bind
avec la même fonction mais avec.live()
seulement.live()
c'est possible (déléguer des événements au document).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 )
Je peux le confirmer directement à partir de la source jQuery:
jQuery (this.context)?
this.context
===document
dans la plupart des casla source
(Ma phrase d'ouverture avait plus de sens avant que vous ne changiez la question. À l'origine, vous aviez dit "Quelle est la différence avec
live
?")on
c'est plus commedelegate
ça que c'est commelive
, c'est fondamentalement une forme unifiée debind
etdelegate
(en fait, l'équipe a dit que son but est "... d'unifier toutes les façons de joindre des événements à un document ..." ).live
est fondamentalementon
(oudelegate
) attaché au document dans son ensemble. Il est obsolète à partir de la v1.7 au profit de l'utilisation deon
oudelegate
. À l'avenir, je suppose que nous verrons du code utilisanton
uniquement, plutôt que d'utiliserbind
oudelegate
(oulive
) ...Ainsi, en pratique, vous pouvez:
Utilisez
on
commebind
:Utilisez
on
likedelegate
(délégation d'événement enracinée dans un élément donné):Utilisez
on
likelive
(délégation d'événement enracinée dans le document):la source
on
est une combinaison debind
etdelegate
, et comme je l'ai dit, pas vraimentlive
. Vous pouvez utiliseron
likebind
(attacher un gestionnaire directement à un élément), ou vous pouvez utiliseron
likedelegate
(attacher un gestionnaire à un élément, mais déclencher l'événement uniquement si l'élément réel sur lequel vous avez cliqué correspond à un sélecteur, et comme si cet élément était celui le événement s'est produit sur - par exemple, délégation d'événement), ou vous pouvez l'utiliser commelive
(endelegate
utilisant le document comme racine). C'est la délégation d'événements qui le rend utile si vous ajoutez des éléments de manière dynamique.$("#id", ".class").live(fn)
=$(".class").delegate("#id", fn );
En fait, dans l'ancienne source jQuery, ils utilisaient live comme cas général et délégué comme cas particulier, ce qui rendait cela encore plus déroutant quand on y réfléchit.delegate
rapidement, mais quand même. :-)live est le raccourci pour .on () maintenant
aussi ce message peut être utile pour vous http://blog.jquery.com/2011/11/03/jquery-1-7-released/
la source
Il n'y en a pas pour le cas d'utilisation de base. Ces deux lignes sont fonctionnellement identiques
.on () peut également effectuer une délégation d'événements, et est préférable.
.bind () est en fait juste un alias pour .on () maintenant. Voici la définition de la fonction bind en 1.7.1
L'idée d'ajouter .on () était de créer une API d'événement unifiée, plutôt que d'avoir plusieurs fonctions pour lier l'événement; .on () remplace .bind (), .live () et .delegate ().
la source
Quelque chose que vous devez savoir si vous voulez que les gestionnaires d'événements soient associés à l'élément - faites attention à quel élément le gestionnaire était attaché!
Par exemple, si vous utilisez:
vous obtiendrez les gestionnaires d'événements en utilisant:
Mais si vous utilisez:
vous obtiendrez les gestionnaires d'événements en utilisant:
(dans le dernier cas, l'objet événement concerné aura selector = ". mySelector")
la source
events
est de toute façon non documenté et je pense que cela ne fonctionne plus dans la version 1.9