2012-06-11 8 views
19

Je sais que nous pouvons attacher des événements avec la fonction jQuery on() et les supprimer à nouveau avec off().En utilisant Jquery off(). On() ou simplement()

Dans un projet existant que je fais parfois rencontriez un code similaire à ceci:

$("#SomeId").off("click").on("click"); 

ou parfois lors de l'utilisation des espaces de noms similaires à ceci:

$("#SomeId").off("click.namespace").on("click.namespace"); 

Pour autant que je sais que vous ne pouvez attacher un seul événement à un espace de noms spécifique de l'événement.

Par exemple, si je fais simplement on("click") il joindre ma fonction spécifiée, la fonction en cours remplaçant attribué , ajoutant à l'événement « clic ».

Si je on("click.namespace") il attacheront ma fonction spécifiée la fonction en cours remplaçant attribué , ajoutant à la click.namespace.

Quel est le point de retirer des événements en enchaînant un off("click") au on("click) si on() remplace déjà des fonctions assignées à l'événement spécifié/event.namespace?

Est-ce une syntaxe redondante dans notre code ou y at-il une raison pour laquelle j'ai manqué?

Edition - Merci kapa
je me sens un peu bête maintenant, je corrige ma connaissance défectueuse ci-dessus. En exécutant on("click.namespace1") plusieurs fois, j'ai observé maintenant que l'objet data("events") continuait à ajouter au tableau d'événements click.

Je pense que cela répond à ma propre question là-bas. C'est pourquoi on utilise off("event.namespace") pour s'assurer que rien d'autre n'est attaché à cet événement/event.namespace exact.

Répondre

29

En fait, vous pouvez attacher plusieurs gestionnaires d'événements au même événement, pas seulement un. Même lorsque les espaces de noms sont utilisés. Découvrez this quick demo.

En fait, l'un des avantages des espaces de noms est que vous pouvez marquer un groupe de gestionnaires d'événements et les supprimer facilement plus tard pour éviter de les attacher plusieurs fois. C'est ce que cette ligne ne:

$("#SomeId").off("click.namespace").on("click.namespace"); 
+0

J'ai édité ma question avec les nouveaux résultats en fonction de vos commentaires. Je me sens un peu bête, je ne l'ai jamais remarqué auparavant en observant l'objet 'data (" events ")'. Merci pour votre réponse. – Jason

0

S'il y a un virage existant (puisque vous pouvez avoir plus d'un, dans ce cas, ils seront chaîne), et il appelle .stopPropagation(), votre clapoteuses ne sera pas appelé . L'écriture du code comme ci-dessus permettra d'éviter ce problème.