139 votes

Différence entre jQuery « clic », « lier », « live », « delegate », « trigger » et « on » fonctionne (avec un exemple) ?

J'ai lu la documentation de chaque fonction sur l' jQuery official website, mais il n'y a pas de comparaison entre les listes ci-dessous les fonctions de:

$().click(fn)
$().bind('click',fn)
$().live('click',fn)
$().delegate(selector, 'click', fn)
$().trigger('click') // UPDATED
$().on('click', selector ,fn); // more UPDATED

S'il vous plaît éviter tout lien de référence.

Comment faire toutes les fonctions ci-dessus exactement travaille et qui doit être privilégié dans lequel la situation?

Remarque: Si il y a une autre fonction(s) ayant la même fonctionnalité ou d'un mécanisme, Alors s'il vous plaît préciser.

Mise à jour

J'ai également vu un $.trigger fonction. Est-il le même travail pour les fonctions ci-dessus?

Plus De Mise À Jour

Maintenant, .on est ajouté dans v1.7 et je pense que celui-ci en quelque sorte de couvrir l'ensemble de fonctions ci-dessus exigence ensemble.

162voto

Nick Craver Points 313913

Avant de lire ceci, tirez cette liste d'événements dans une autre page, l'API en elle-même est extrêmement utile, et tout ce que je discute ci-dessous est lié directement à partir de cette page.

Tout d'abord, .click(function) est littéralement un raccourci pour .bind('click', function), ils sont équivalents. Les utiliser 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à. Également des éléments qui n'étaient pas là lorsque ce code est exécuté à joindre le gestionnaire (par exemple le sélecteur trouvé à l'époque) n'obtiendrez pas le gestionnaire.

.live() et .delegate() sont liées de la même façon, .delegate() utilise réellement .live() en interne, ils ont à la fois écouter les événements de la bulle. Cela fonctionne pour les nouveaux et les anciens éléments, ils bouillonnent les événements de la même façon. Vous utilisez lors de vos éléments peuvent changer, par exemple en ajoutant de nouvelles lignes, les éléments de la liste, etc. Si vous n'avez pas un parent ou un ancêtre commun qui va rester à la page et ne pas être remplacé à tout moment, utilisez .live(), comme ceci:

$(".clickAlert").live('click', function() {
  alert("A click happened");
});

Si toutefois vous avez un parent de l'élément de quelque part qui n'est pas remplacé (donc ses gestionnaires d'événements ne vont pas bye bye), vous devez manipuler avec .delegate(), comme ceci:

$("#commonParent").delegate('.clickAlert', 'click', function() {
  alert("A click happened, it was captured at #commonParent and this alert ran");
});

Cela fonctionne presque le même que .live(), mais l'événement bulles de moins en moins de temps avant d'être capturé et les gestionnaires d'exécution. Une autre utilisation courante de ces deux est à dire que vos changements de classe sur un élément, qui n'est plus correspondant au sélecteur d'origine que vous avez utilisé...avec ces méthodes, le sélecteur est évaluée au moment de l'événement, si elle correspond, le gestionnaire de pistes...de sorte que l'élément n'est plus correspondant au sélecteur de questions, il ne s'exécute plus. Avec .click() toutefois, le gestionnaire d'événement est lié droit sur l'élément DOM, le fait qu'il ne correspond pas à ce que le sélecteur est utilisé pour le trouver, c'est hors de propos...l'événement est lié et il est rester jusqu'à ce que l'élément a disparu, ou le gestionnaire est éliminée via .unbind().

Encore une autre utilisation courante .live() et .delegate() est le rendement. Si vous faites affaire avec beaucoup d'éléments, en y joignant un gestionnaire de clic directement à chaque élément est coûteux et prend du temps. Dans ces cas, il est plus économique à l'installation d'un unique gestionnaire et laissez bouillonner faire le travail, jetez un oeil à cette question où il a fait une énorme différence, c'est un bon exemple de l'application.


Déclenchement - pour la mise à jour de question

Il y a 2 main event-handler fonctions de déclenchement disponibles, qu'ils relèvent de la même "Gestionnaire d'Événement de la pièce Jointe dans la catégorie" API, ce sont des .trigger() et .triggerHandler(). .trigger('eventName') a certains 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 afficher une liste, y compris ces raccourcis ici.

Quant à la différence, .trigger() déclenche le gestionnaire d'événement (mais pas l'action par défaut la plupart du temps, par exemple, de placer le curseur au bon endroit dans un cliqué <textarea>). Il provoque les gestionnaires d'événements de se produire dans l'ordre où ils ont été tenus (comme les natifs de l'événement), les feux de la maternelle, les actions d'événement, les bulles et les DOM.

.triggerHandler() est généralement dans un but différent, ici, vous êtes juste essayer de feu le gestionnaire(s), il ne cause pas le natif cas d'incendie, par exemple, l'envoi d'un formulaire. Il n'a pas de bulle les DOM, et ce n'est pas chainable (il retourne quelle que soit la dernière lié gestionnaire d'événement pour l'événement en retourne). Par exemple, si vous voulez déclencher une focus événement, mais pas vraiment l'objet, il suffit d'un code lié avec .focus(fn) , ce serait le faire, alors qu' .trigger() le feraient aussi bien que le fait de concentrer l'élément et de la bulle.

Voici un exemple réel:

$("form").submit(); //actually calling `.trigger('submit');`

Cela irait à tout soumettre des gestionnaires, par exemple le plugin jQuery validation, puis essayez d'introduire l' <form>. Toutefois, si vous juste voulu valider, depuis qu'il est raccordé par l'intermédiaire d'un submit gestionnaire d'événements, mais de ne pas soumettre l' <form> par la suite, vous pouvez utiliser .triggerHandler('submit'), comme ceci:

$("form").triggerHandler('submit');

Le plugin empêche le gestionnaire de la soumission du formulaire par les bombardements si la validation ne passe pas, mais avec cette méthode, nous ne se soucient pas ce qu'il fait. Si elle annulée ou non, nous ne sommes pas d'essayer de soumettre le formulaire, nous voulions juste un déclencheur pour re-valider et de ne rien faire d'autre. (Avertissement: Ceci est un superflu exemple, puisqu'il y a un .validate() méthode dans le plugin, mais c'est un décent illustration d'intention)

28voto

Fyodor Soikin Points 7907

Les deux premières sont équivalentes.

// The following two statements do the same thing:
$("blah").click( function() { alert( "Click!" ); } );
$("blah").bind( "click", function() { alert( "Click!" ); } ); 

Le second, bien que, peut être utilisé pour lier plusieurs événements en même temps, en spécifiant plusieurs séparés par des espaces, les noms d'événements:

$("blah").bind( "click mouseover mouseout", function() { alert( "Click! Or maybe mouse moved." ); } ); 

L' .live méthode est plus intéressante. Considérons l'exemple suivant:

<a class="myLink">A link!</a>
<a id="another">Another link!</a>

<script>
    $("a.myLink").click( function() { alert( 'Click!' ); } );

    $("a#another").addClass( "myLink" );
</script>

Après la deuxième ligne du script s'exécute, le deuxième lien aura aussi une classe CSS de "myLink". Mais il n'aura pas le gestionnaire d'événements, car elle n'a pas la classe lorsque l'événement a été attaché.

Considérons maintenant vous vouliez être dans l'autre sens: à chaque fois un lien avec la classe "myLink" apparaît quelque part sur la page, vous voulez qu'elle ait le même gestionnaire d'événements automatiquement. Ceci est très fréquent lorsque vous avez une sorte de listes ou de tableaux, où vous ajouter des lignes ou des cellules de manière dynamique, mais voulons tous de se comporter de la même manière. Au lieu d'aller à tous la douleur de l'attribution des gestionnaires d'événements de nouveau à chaque fois, vous pouvez utiliser l' .live méthode:

<a class="myLink">A link!</a>
<a id="another">Another link!</a>

<script>
    $("a.myLink").live( "click", function() { alert( 'Click!' ); } );

    $("a#another").addClass( "myLink" );
</script>

Dans cet exemple, la seconde vous obtiendrez également le gestionnaire d'événement dès qu'il reçoit le "myLink" de la classe. La magie! :-)

Bien sûr, il n'est pas littérale. Ce .live n'a vraiment attacher le gestionnaire pas à l'élément lui-même, mais également à la racine de l'HTML arbre (le "corps" de l'élément). Les événements en DHTML ont cette drôle de fonction de "remonter". Réfléchissez à ceci:

<div> <a> <b>text</b> </a> </div>

Si vous cliquez sur "texte", puis la première à l'élément <b> obtiendrez un événement "click". Après cela, l'élément <a> obtenez un événement "click". Et après que la balise <div> de l'élément obtiendrez un événement "click". Et ainsi de suite - tout le chemin jusqu'à l'élément <body>. Et c'est là que jQuery de capture de l'événement et de voir s'il y a des "live" gestionnaires qui s'appliquent à l'élément qui a provoqué l'événement en premier lieu. Neat!

Et enfin, l' .delegate méthode. Il suffit de prendre tous les enfants de votre élément qui respectent le sélecteur de donnée et de fixer un "live" de gestionnaire. Prendre un coup d'oeil:

$("table").delegate( "td", "click", function() { alert( "Click!" ); } );

// Is equivalent to:
$("table").each( function() {
    $(this).find( "td" ).live( "click", function() { alert( "Click!" ); } );
} );

Des Questions?

8voto

Jonathan Tonge Points 860

À partir de jQuery 1.7, la méthode .live() est obsolète. Si vous utilisez une version de jQuery .Live() a été remplacer par .on().

Mieux d’aller directement sur le site de jQuery pour plus d’informations, mais ici est les versions actuelles de la méthode .on() :

http://API.jQuery.com/on/

2voto

fbuchinger Points 2724

$().click(fn) et $().bind('click', fn) sont identiques à première vue, mais l' $.bind la version la plus puissante pour deux raisons:

  1. $().bind() vous permet d'assigner un gestionnaire d'événements multiples, par exemple, $().bind('click keyup', fn).
  2. $().bind() prend en charge des espaces événements - une fonctionnalité puissante si vous souhaitez supprimer (séparer), seuls certains gestionnaires d'événements qu'un élément est lié à lire plus dans des Espaces Événements.

Live vs délégué: cela a déjà été répondu dans les autres réponses.

1voto

Dan Beam Points 2045

C'est là que la lecture de l'API peut aider. Cependant, je sais que du haut de ma tête, de sorte que vous pouvez continuer à être paresseux (yay!).

$('#something').click(fn);
$('#something').bind('click',fn);

Il n'y a pas de différence ici (que je connais). .click est tout simplement une commodité/méthode d'aide à l' .bind('click'

// even after this is called, all <a>s in
// <div class="dynamic_els"> will continue
// to be assigned these event handlers

$('div.dynamic_els a').live(‘click',fn);

C'est très différent, comme .live y ajoute des événements le sélecteur de vous passer (que vous n'avez pas ici) et continue à regarder les DOM comme des nœuds, sont insérés ou retirés

$('#some_element').delegate('td','click',fn);

Ce n'est différent en raison de la façon dont vous êtes l'attribution des gestionnaires d'événements. .delegate est centrée sur les DOM de remontée d'événements. Le principe de base est que chaque événement bulles vers le haut à travers l'arbre du DOM, jusqu'à atteindre l'élément racine (document ou window ou <html> ou <body>, je ne me souviens pas exactement).

De toute façon, vous êtes de la liaison d'un onclick gestionnaire à un tous les de la <td>s dans $('#some_element') (vous devez spécifier un sélecteur, si vous pouvez dire $(document)). Lorsque l'un de ses enfants est cliqué, l'événement se propage jusqu'à l' <td>. Vous pouvez ensuite extraire l'élément source de l'événement (qui fait jQuery pour vous automatiquement).

Ceci est utile quand il y a des tonnes d'éléments et il ne vous reste que quelques-uns (ou un seul) point[s] de ces événements. Cela permet d'économiser le navigateur de l'effort et de la mémoire pour consolider ces gestionnaires d'événements dans moins d'objets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X