J'utilise jQuery v.1.7.1 où la méthode .live () est apparemment obsolète.
Le problème que j'ai est que lors du chargement dynamique de code HTML dans un élément à l'aide de:
$('#parent').load("http://...");
Si j'essaie d'ajouter un événement de clic par la suite, il n'enregistre pas l'événement à l'aide de l'une des méthodes suivantes:
$('#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é? Cela ne semble fonctionner qu'avec .live () pour moi, mais je ne devrais pas utiliser cette méthode. Notez que #child est un élément chargé dynamiquement.
Merci.
.live()
il vous indique comment réécrire les utilisations existantes de.live()
à utiliser.delegate()
ou.on()
(selon que vous êtes sur la version 1.7+ ou non). Notez cependant que si vous ajoutez un gestionnaire avec.click()
"après" comme vous le mentionnez, c'est-à-dire après avoir chargé dynamiquement des éléments, cela devrait fonctionner - le seul problème est d'essayer d'assigner avec.click()
avant de charger dynamiquement des éléments.Réponses:
Si vous voulez que le gestionnaire de clics fonctionne pour un élément qui est chargé dynamiquement, vous définissez le gestionnaire d'événements sur un objet parent (qui n'est pas chargé dynamiquement) et lui donnez un sélecteur qui correspond à votre objet dynamique comme ceci:
Le gestionnaire d'événements sera attaché à l'
#parent
objet et chaque fois qu'un événement de clic se propage à lui#child
, il déclenchera votre gestionnaire de clics. C'est ce qu'on appelle la gestion des événements déléguée (la gestion des événements est déléguée à un objet parent).C'est fait de cette façon parce que vous pouvez attacher l'événement à l'
#parent
objet même lorsque l'#child
objet n'existe pas encore, mais quand il existe plus tard et qu'il est cliqué dessus, l'événement click va bouillonner jusqu'à l'#parent
objet, il verra qu'il est originaire#child
et il y a un gestionnaire d'événements pour un clic#child
et déclencher votre événement.la source
live()
contreon()
mais ce soir j'ai décidé encore une fois pour essayer, et votre explication révèle immédiatement ce que j'avais été absent tout au long. Merci!mouseenter
et lesmouseleave
événements et les tests dans le gestionnaire lequel a été déclenché. L'événement pseudo "survol" de jQuery n'est pas disponible avec la délégation.Essaye ça:
De la
$.on()
documentation:Votre
#child
élément n'existe pas lorsque vous l'appelez$.on()
, donc l'événement n'est pas lié (contrairement$.live()
).#parent
Cependant, ne exist, liant donc l'événement qui est très bien.Le deuxième argument de mon code ci-dessus agit comme un «filtre» pour ne se déclencher que si l'événement s'est propagé à
#parent
partir de#child
.la source
.load()
méthode - pas à partir du code après la.load()
méthode.#child
est uniquement connu pour être chargé lorsque le gestionnaire de réussite s'exécute réellement et pas avant.$(document).on('click', '.selector', function() { /* do stuff */ });
EDIT: Je fournis un peu plus d'informations sur la façon dont cela fonctionne, parce que ... des mots. Avec cet exemple, vous placez un écouteur sur l'ensemble du document.
Lorsque vous correspondez
click
à n'importe quel élément.selector
, l'événement bouillonne jusqu'au document principal - tant qu'il n'y a pas d'autres écouteurs qui appellent laevent.stopPropagation()
méthode - ce qui dépasserait la propagation d'un événement aux éléments parents.Au lieu de vous lier à un élément ou un ensemble d'éléments spécifique, vous écoutez les événements provenant d'éléments qui correspondent au sélecteur spécifié. Cela signifie que vous pouvez créer un écouteur, une fois, qui correspondra automatiquement aux éléments existants ainsi qu'à tous les éléments ajoutés dynamiquement.
C'est intelligent pour plusieurs raisons, notamment les performances et l'utilisation de la mémoire (dans les applications à grande échelle)
ÉDITER:
De toute évidence, l'élément parent le plus proche que vous pouvez écouter est meilleur, et vous pouvez utiliser n'importe quel élément à la place
document
tant que les enfants pour lesquels vous souhaitez surveiller les événements se trouvent dans cet élément parent ... mais cela n'a vraiment rien à voir avec la question.la source
$(element).on(...)
. C'est ça$(document).on(...,element,...)
. Différentes bêtes.L'équivalent de .live () en 1.7 ressemble à ceci:
Fondamentalement, regardez le document pour les événements de clic et filtrez-les pour #enfant.
la source
.live()
)..live()
est obsolète maintenant est qu'il est mauvais de placer tous les gestionnaires d'événements en direct sur l'objet document. Les choses peuvent vraiment, vraiment ralentir. Non seulement les événements doivent remonter jusqu'au document, mais vous pouvez avoir de nombreux gestionnaires d'événements à parcourir sur l'objet document. Le principal avantage.on()
est que vous pouvez l'attacher à un objet parent qui est beaucoup plus proche de l'objet réel et améliorer considérablement les performances. Donc ... je ne recommanderais PAS d'utiliser.on()
avec l'objet document. Il vaut mieux choisir un objet parent plus proche..live()
Je sais qu'il est un peu tard pour une réponse, mais j'ai créé un polyfill pour la méthode .live (). Je l'ai testé dans jQuery 1.11, et il semble fonctionner assez bien. Je sais que nous sommes censés implémenter la méthode .on () dans la mesure du possible, mais dans les grands projets, où il n'est pas possible de convertir tous les appels .live () en appels équivalents .on () pour une raison quelconque, ce qui suit pourrait travail:
Il suffit de l'inclure après avoir chargé jQuery et avant d'appeler live ().
la source
.on () est pour jQuery version 1.7 et supérieure. Si vous avez une ancienne version, utilisez ceci:
la source
.delegate()
fonctionne beaucoup mieux que.live()
ce qui explique pourquoi le doc jQuery le recommande et déconseille.live()
. Oui,.live()
ça marche toujours, mais les réponses ici sur SO devraient recommander la meilleure façon de faire les choses. J'ai vu cela 20 fois ici sur SO. Si vous publiez du code avec.live()
ici sur SO, il sera voté (pas habituellement par moi, sauf s'il y a quelque chose de grave qui ne va pas)..live()
fonctionne définitivement même dans la version 1.7, vous devriez toujours l'utiliser.delegate()
ou.on()
parce qu'il.live()
est déconseillé pour une bonne raison. Tant que vous notez le changement de syntaxe pour les deux nouvelles fonctions, cela fonctionnera bien.J'ai utilisé «live» dans mon projet mais un de mes amis a suggéré que je devrais utiliser «on» au lieu de live. Et quand j'ai essayé de l'utiliser, j'ai rencontré un problème comme vous.
Sur mes pages, je crée dynamiquement des lignes de tableau de boutons et de nombreux éléments dom. mais quand j'utilise sur la magie a disparu.
Les autres solutions comme l'utiliser comme un enfant appellent simplement vos fonctions à chaque fois à chaque clic. Mais je trouve un moyen d'y arriver à nouveau et voici la solution.
Écrivez votre code comme:
Appelant appelant (); après avoir créé votre objet dans la page comme celle-ci.
De cette façon, votre fonction est appelée alors qu'elle n'est pas censée faire chaque clic sur la page.
la source