jQuery .live() vs .sur() méthode pour ajouter un événement de clic après le chargement dynamique de code html
Je suis à l'aide de jQuery v. 1.7.De 1 où la .live() la méthode est apparemment obsolète.
Le problème que j'ai est que lorsque le chargement dynamique de code html sur un élément à l'aide de:
$('#parent').load("http://...");
Si j'essaie d'ajouter un événement click ensuite, il ne doit pas s'inscrire à l'événement en utilisant une de ces méthodes:
$('#parent').click(function() ...);
ou
//according to documentation this should be used instead of .live()
$('#child').on('click', function() ...);
Quelle est la bonne façon d'obtenir cette fonctionnalité? Il semble que pour travailler avec .live() pour moi, mais je ne devrais pas être à l'aide de cette méthode. Notez que #enfant est chargé dynamiquement élément.
Grâce.
- Pourquoi dites-vous "soi-disant obsolète"? Ne croyez-vous pas les docs?
- Ce n'est pas soi-disant obsolète: il est obsolète. Si vous regardez le jQuery doco pour
.live()
il vous indique la façon de réécrire les utilisations existantes de.live()
à utiliser.delegate()
ou.on()
(selon que vous êtes sur la version 1.7+ ou pas). Notez cependant que si vous ajoutez un gestionnaire avec.click()
"après", comme vous le mentionnez, c'est à dire, après le chargement dynamique des éléments, il devrait fonctionner - le seul problème est d'essayer d'attribuer avec.click()
avant de les charger dynamiquement des éléments. - J'ai changé le texte "apparemment", car c'est en gros ce que je voulais dire. De toute façon, je comprends maintenant que, évidemment, depuis le .load() de l'événement est asynchrone, puis le n ° de l'élément enfant ne pourrait sûrement être reconnu dans le gestionnaire de succès, qui a du sens.
- Double Possible de liaison d'Événements sur créer dynamiquement des éléments?
Vous devez vous connecter pour publier un commentaire.
Si vous voulez que le gestionnaire de clic de travailler pour un élément qui est chargé dynamiquement, vous pouvez alors définir le gestionnaire d'événement sur un objet parent (ce qui ne veut pas se charger dynamiquement) et lui donner un sélecteur qui correspond à votre dynamique d'un objet comme ça:
Le gestionnaire d'événement sera joint à la
#parent
objet et chaque fois qu'un événement de clic les bulles jusqu'à ce que provenait d'#child
, il va mettre le feu à votre gestionnaire de clic. Ceci est appelé délégué la gestion des événements (la gestion des événements est déléguée à un objet parent).C'est fait de cette façon parce que vous pouvez joindre à l'événement pour la
#parent
objet, même lorsque le#child
objet n'existe pas encore, mais plus tard, quand il existe, et obtient cliqué sur, l'événement click de la bulle jusqu'à la#parent
objet, il va voir qu'il est apparu sur#child
et il y a un gestionnaire d'événement pour un clic sur#child
et le feu de votre événement.live()
vson()
mais ce soir j'ai décidé encore une fois d'essayer, et votre explication immédiatement révélé ce que j'avais été absent tout au long. Merci!mouseenter
etmouseleave
événements et de test à l'intérieur du gestionnaire de celui qui a été déclenché. jQuery pseudo "hover" événement n'est pas disponible avec la délégation.Essayez ceci:
De la
$.sur()
documentation:Votre
#child
élément n'existe pas lorsque vous appelez$.on()
sur elle, de sorte que l'événement n'est pas lié (contrairement à$.live()
).#parent
, cependant, ne existent, de sorte que la liaison de l'événement, c'est très bien.Le deuxième argument dans mon code ci-dessus, agit comme un "filtre" pour les ne se déclenchera que si l'événement bouillonnait à
#parent
de#child
..load()
méthode n'est pas le code après le.load()
méthode.#child
est connu pour être chargé lorsque le gestionnaire de succès s'exécute en fait, et pas avant.$(document).on('click', '#selector', function() { /* do stuff */});
EDIT: je suis en fournissant des informations un peu plus sur la façon dont cela fonctionne, parce que... les mots.
Avec cet exemple, vous placez un listener sur l'ensemble du document.
Lorsque vous
click
sur n'importe quel élément(s) correspondant à#selector
, l'événement bulles pour le document principal-tant qu'il n'y a pas d'autres auditeurs qui appellentevent.stopPropagation()
méthode, ce qui prendrait le dessus le bouillonnement de un événement aux éléments parents.Au lieu de se lier à un élément spécifique ou un ensemble d'éléments, vous êtes à l'écoute de tous les événements à venir à partir d'éléments qui correspondent au sélecteur de spécifié. Cela signifie que vous pouvez en créer un à l'écoute, un temps, qui correspondra automatiquement actuellement des éléments déjà existants, ainsi que de toute manière dynamique des éléments ajoutés.
C'est pratique pour plusieurs raisons, y compris la performance et l'utilisation de la mémoire (dans les applications à grande échelle)
$(element).on(...)
. C'est$(document).on(...,element,...)
. Différentes bêtes.L'équivalent de .live() en 1.7 ressemble à ceci:
Fondamentalement, regarder le document cliquez sur les événements et de les filtrer pour #enfant.
.live()
n')..live()
est obsolète maintenant, c'est parce que c'est mauvais pour les mettre tous en direct des gestionnaires d'événement de l'objet document. Les choses peuvent vraiment, vraiment ralentir. Non seulement les événements ont à faire des bulles tout le chemin jusqu'à le document, mais vous pouvez avoir beaucoup de gestionnaires d'événements à regarder à travers sur l'objet document. LE principal avantage de.on()
est que vous pouvez attacher à un objet parent, qui est beaucoup plus proche de l'objet réel et d'améliorer considérablement les performances. Alors ... je vous déconseille d'utiliser.on()
avec l'objet document. Beaucoup mieux de choisir un plus proche parent de l'objet..live()
approche; toutefois, la capacité de contrôle de la délégation est certainement un avantage.Je sais que c'est un peu tard pour une réponse, mais j'ai créé un polyfill pour la .live() la méthode. Je l'ai testé dans jQuery 1.11, et il semble fonctionner assez bien. Je sais que nous sommes censés mettre en œuvre l' .sur() la méthode dans la mesure du possible, mais dans de grands projets, où il n'est pas possible de convertir toutes les .live() appelle à l'équivalent .sur() appelle pour quelque raison que ce soit, les éléments suivants pourraient travailler:
Simplement l'inclure après chargement de jQuery et avant d'appeler live().
.sur() est pour la version jQuery 1,7 et au-dessus. Si vous avez une ancienne version, utilisez ceci:
.live()
a été supprimée pour toutes les versions de jQuery. Avant la 1.7, il est recommandé d'utiliser.delegate()
, pas.live()
..delegate()
effectue beaucoup mieux que.live()
c'est pourquoi la doc jQuery, il recommande, et dénonçait.live()
. Oui,.live()
fonctionne toujours, mais les réponses ici sur devraient DONC recommander la meilleure manière de faire les choses. Je l'ai vu 20 fois ici sur DONC. Si vous affichez le code avec.live()
ici, il sera reçu downvoted (et pas par moi, sauf si il ya quelque chose de mal avec elle)..live()
fonctionne bien même dans la version 1.7, vous devriez toujours utiliser.delegate()
ou.on()
parce que.live()
est déconseillée pour une bonne raison. Tant que vous notez le changement dans la syntaxe pour les deux plus récents, soit les fonctions fonctionnent correctement.J'ai utilisé "vivre" dans mon projet, mais un de mes ami a suggéré que je devrais utiliser " on " au lieu de vivre.
Et quand j'ai essayé d'utiliser ce que j'ai vécu un problème comme vous l'avez fait.
Sur mes pages, j'ai créer des boutons de lignes de la table et beaucoup dom choses de façon dynamique. mais quand j'utilise la magie a disparu.
Les autres solutions comme l'utiliser comme un enfant appelle simplement vos fonctions à chaque fois sur chaque clic.
Mais je trouve un moyen pour le faire à nouveau et c'est ici la solution.
Écrire votre code comme:
Appel de l'appelant(); après la création de votre objet dans la page comme ceci.
Par ce moyen, votre fonction est appelée lorsqu'il est supposé ne pas chaque fois que vous cliquez sur la page.