2013-01-14 2 views
0

Est-il possible de déléguer un événement en utilisant jQuery qui correspondra à tous les éléments sur la page qui correspondent à la sélection, autre que la délégation de $(document)?délégation d'événements jQuery 1.7.2

Puisque c'est probablement mal formulé, voici le hic:

Il y avait jQuery.live que délégué des événements à tous les éléments qui correspondent le sélecteur. Cela a été remplacé par jQuery.delegate qui a délégué des événements dans un sélecteur de contexte spécifique à ses enfants, qui à son tour a été remplacé par jQuery.on, ce qui fait effectivement la même chose, mais avec des bits différents dans les coulisses (j'imagine). Ce que je veux faire, est d'ajouter en toute sécurité un gestionnaire d'événements à chaque div.foo sur ma page, peu importe où il pourrait vivre, ou quand il pourrait vivre. Selon la documentation, et la recherche empirique, ce qui suit se liera uniquement aux éléments .foo qui existent lors de l'exécution du script. Comme il y a du code qui pourrait placer un élément .foo sur la page plus tard, cela ne fonctionne pas exactement.

jQuery('.foo').on('click', handler); 

Depuis live est dépréciée (peut-être enlevé?), J'essaie de ne pas utiliser, mais la seule solution que je peux trouver est

jQuery(document).on('click', '.foo', handler); 

Mais est-ce pas ce que live fait à l'origine, dans les coulisses? Plus précisément, y at-il des raisons significatives pas pour ce faire?

Nous sommes spécifiquement en utilisant la version 1.7.2, mais les réponses jQuery génériques aiderions aussi.

+0

C'est ce que 'live' a fait à l'origine, mais c'est aussi exactement ce que vous cherchez. Idéalement, vous utiliseriez autre chose que 'document', mais si vous ne pouvez pas le réduire, alors' document' est votre seul choix. –

+0

@ JamesMontagne oui je m'en doutais autant. Je ne savais pas s'il y avait une raison de ne pas déléguer au document, à part le fait que 'stopPropagation' pourrait gêner. –

+1

Performances également. Il doit faire des bulles tout le long et chaque clic sur la page est intercepté et vérifié pour voir si c'est le bon sélecteur. –

Répondre

1

La bulle des événements de leur source, à ce qu'ils sont délégués, vous devez donc utiliser jquery(). Sur ce que jamais le niveau est le plus bas parent commun. Si c'est le document, alors qu'il en soit ainsi.

Sinon, si vos articles .foo sont toujours créés dans un .foocontainer (ou quelque chose) alors vous pouvez l'utiliser dans votre sélecteur, même s'il y en a plus d'un - vous venez de vous attacher. Je pense que le problème avec la délégation de retour au document est que l'événement peut nécessiter un nombre important de bulles, entraînant une surcharge supplémentaire dans le processus, il est donc préférable de déléguer l'événement le plus près possible de la source.

1

Vous avez raison que la liaison au document (comme ci-dessous) est exactement ce que live() fait:

jQuery(document).on('click', '.foo', handler); 

La raison pour cela est mauvais est parce qu'il est pas très performant. Chaque fois que vous cliquez, n'importe où, le document vérifie s'il se trouvait sur l'élément délégué.

La meilleure méthode consiste à utiliser un élément à la place de document qui est le parent le plus proche de ceux qui sont ajoutés dynamiquement, mais qui est disponible au chargement de la page. Même s'il s'agit d'un conteneur de niveau supérieur, il offre toujours un avantage de performance par rapport à tout ce qui est lié à document.

Questions connexes