Avant de lire ceci, tirez cette liste d'événements sur une autre page, l'API elle-même est extrêmement utile et tout ce dont je parle ci-dessous est directement lié à cette page .
Tout d'abord, .click(function)
c'est littéralement un raccourci pour .bind('click', function)
, ils sont équivalents. Utilisez-les lors de la liaison d'un gestionnaire directement à un élément , comme ceci:
$(document).click(function() {
alert("You clicked somewhere in the page, it bubbled to document");
});
Si cet élément est remplacé ou jeté, ce gestionnaire ne sera plus là. De plus, les éléments qui n'étaient pas là lorsque ce code a été exécuté pour attacher le gestionnaire (par exemple, le sélecteur l'a trouvé alors) n'obtiendront pas le gestionnaire.
.live()
et .delegate()
sont similaires, .delegate()
utilisent en fait en .live()
interne, ils écoutent tous les deux les événements à bouillir. Cela fonctionne pour les éléments nouveaux et anciens , ils font des bulles d'événements de la même manière. Vous les utilisez lorsque vos éléments peuvent changer, par exemple en ajoutant de nouvelles lignes, des éléments de liste, etc. Si vous n'avez pas de parent / ancêtre commun qui restera dans la page et ne sera remplacé à aucun moment, utilisez .live()
, comme ceci:
$(".clickAlert").live('click', function() {
alert("A click happened");
});
Si toutefois vous avez un élément parent quelque part qui n'est pas remplacé (donc ses gestionnaires d'événements ne vont pas bye bye), vous devriez le gérer .delegate()
, comme ceci:
$("#commonParent").delegate('.clickAlert', 'click', function() {
alert("A click happened, it was captured at #commonParent and this alert ran");
});
Cela fonctionne presque de la même manière que .live()
, mais l'événement bouillonne moins de fois avant d'être capturé et les gestionnaires exécutés. Une autre utilisation courante de ces deux méthodes est que votre classe change sur un élément, ne correspondant plus au sélecteur que vous avez utilisé à l'origine ... avec ces méthodes, le sélecteur est évalué au moment de l'événement , s'il correspond, le gestionnaire s'exécute. .so l'élément qui ne correspond plus au sélecteur compte, il ne s'exécutera plus. Avec .click()
toutefois, le gestionnaire d'événements est droit lié à l'élément DOM, le fait qu'il ne correspond pas à ce que le sélecteur a été utilisé pour trouver est hors de propos ... l'événement est lié et il va rester jusqu'à cet élément est parti, ou le gestionnaire est supprimé via .unbind()
.
Encore une autre utilisation courante pour .live()
et .delegate()
est la performance . Si vous avez affaire à de nombreux éléments, attacher un gestionnaire de clics directement à chaque élément est coûteux et prend du temps. Dans ces cas, il est plus économique de configurer un seul gestionnaire et de laisser le bullage faire le travail, jetez un œil à cette question où cela a fait une énorme différence , c'est un bon exemple de l'application.
Déclenchement - pour la question mise à jour
Il y a 2 principales fonctions de déclenchement de gestionnaire d'événements disponibles, elles appartiennent à la même catégorie "Event Handler Attachment" dans l'API , ce sont .trigger()
et .triggerHandler()
. .trigger('eventName')
a quelques raccourcis intégrés pour les événements courants, par exemple:
$().click(fn); //binds an event handler to the click event
$().click(); //fires all click event handlers for this element, in order bound
Vous pouvez voir une liste comprenant ces raccourcis ici .
Quant à la différence, .trigger()
déclenche le gestionnaire d'événements (mais pas l'action par défaut la plupart du temps, par exemple en plaçant le curseur au bon endroit dans un clic <textarea>
). Cela provoque les gestionnaires d'événements dans l'ordre dans lequel ils ont été liés (comme le ferait l'événement natif), déclenche les actions d'événement natif et fait remonter le DOM.
.triggerHandler()
est généralement dans un but différent, ici vous essayez juste de déclencher le (s) gestionnaire (s) lié (s), cela ne provoque pas le déclenchement de l'événement natif, par exemple la soumission d'un formulaire. Il ne fait pas de bulles dans le DOM et n'est pas chaînable (il renvoie tout ce que le dernier gestionnaire d'événements lié pour cet événement renvoie). Par exemple, si vous vouliez déclencher un focus
événement mais ne pas focaliser réellement l'objet, vous voulez juste que le code avec .focus(fn)
lequel vous êtes lié s'exécute, cela le ferait, alors que le .trigger()
ferait aussi bien que concentrer l'élément et faire des bulles.
Voici un exemple du monde réel:
$("form").submit(); //actually calling `.trigger('submit');`
Cela exécutera tous les gestionnaires de soumission, par exemple le plugin de validation jQuery , puis essaiera de soumettre le fichier <form>
. Cependant, si vous vouliez simplement valider, puisqu'il est connecté via un submit
gestionnaire d'événements, mais pas soumettre <form>
ensuite, vous pouvez utiliser .triggerHandler('submit')
, comme ceci:
$("form").triggerHandler('submit');
Le plugin empêche le gestionnaire de soumettre le formulaire en bombardant si le contrôle de validation échoue, mais avec cette méthode, nous ne nous soucions pas de ce qu'il fait. Que ce soit avorté ou non nous ne sommes pas essayer de soumettre le formulaire, nous voulions juste déclencher revalider et ne rien faire d' autre. ( Avertissement: c'est un exemple superflu car il y a une .validate()
méthode dans le plugin, mais c'est une bonne illustration de l'intention)