2010-10-07 7 views
6

DepuisQuelle est la différence entre .delegate() et live()?

$("table").delegate("td", "hover", function(){ 
    $(this).toggleClass("hover"); 
}); 

est équivalent au code suivant écrit en utilisant .live():

$("table").each(function(){ 
    $("td", this).live("hover", function(){ 
     $(this).toggleClass("hover"); 
    }); 
}); 

selon jQuery API.

Je parie que je me trompe, mais est-il pas le même d'écrire

$("table td").live('hover', function() {}); 

Alors, qu'est-ce que est .delegate() pour?

+0

duplication possible de [jQuery: live() vs delegate()] (http://stackoverflow.com/questions/4204316/jquery-live-vs-delegate) –

Répondre

4

.live() écoutes sur document alors que .delegate() écoute sur un élément plus locale, le <table> dans ce cas.

Ils agissent tous deux de la même manière en écoutant les événements à bulles, celui à .delegate() juste des bulles moins avant d'être attrapé.

Votre exemple:

$("table td").live('hover', function() {}); 

est pas le même, car il attache à nouveau un gestionnaire d'événements à document et non le <table>, donc .delegate() est pour plus des éléments locaux, plus efficaces dans la plupart des points .. .bien qu'il utilise encore .live() sous les couvertures.


Gardez à l'esprit que $(selector) récupère les éléments, donc $("table td") sélectionne un tas d'éléments vraiment aucune bonne raison lors de l'utilisation .live(), alors que $("table").delegate() sélectionne seulement les éléments <table>, donc même d'abord, il est plus efficace en n'exécutant pas le sélecteur et en ignorant le résultat.

+0

Est-il possible de voir l'écouteur d'événement sur le Chrome? Outils de développement lors de la sélection de l'élément correspondant? –

+0

Bien que $ ("table td"). Live ('hover', function() {}); 'est le même lorsque vous utilisez la méthode' .each() ', n'est-ce pas? –

+0

Sur l'élément que vous attachez .delegate() 'à oui, vous pouvez le voir dans son objet' .data ("events") ', ou' $ .cache [élément [$. Expando]]. Events', où 'elemenet [$. expando]' est le 'jquery230420498204824 = 132' que vous voyez sur l'élément, que 132 est la clé dans' $ .cache', donc '$ .cache [132] .events' est l'objet que vous êtes après. –

0

Le doc:

Puisque la méthode gère .live() des événements une fois qu'ils ont propagé au haut du document, il est impossible d'arrêter la propagation des événements en direct. De même, les événements gérés par .delegate() seront toujours propagés à l'élément auquel ils sont délégués; Les gestionnaires d'événements sur les éléments situés en dessous auront déjà été exécutés au moment où le gestionnaire d'événements délégué est appelé.

5

Les travaux façon live() est qu'il place un gestionnaire au niveau supérieur du DOM (le document) qui détecte les bulles de votre événement choisi jusqu'à ce niveau (et vérifie ensuite si elle a été lancée par un élément qui correspond à votre sélecteur).

delegate() fonctionne de la même manière, mais le gestionnaire est placé sur votre élément sélectionné (il ne peut donc détecter que les événements lancés par les descendants de cet élément). Les inconvénients de live() sont 1) les problèmes de performances inhérents à la détection et la vérification de tous les événements qui atteignent le niveau du document, et 2) le fait que vous ne pouvez pas arrêter la propagation du tout sur ces événements (puisque vous avez gagné ' Je ne les connais pas jusqu'à ce qu'ils atteignent le niveau du document).

delegate() atténue ces deux problèmes en vous permettant de contraindre le gestionnaire à un plus petit ensemble d'éléments (les éléments qui correspondent à votre sélecteur et leurs descendants) plutôt que la page entière.

Questions connexes