107 votes

Ajout de récepteurs d'événements aux éléments ajoutés dynamiquement à l'aide de jQuery

Donc, pour l'instant, je comprends que pour attacher un écouteur d'événements à un dynamiquement ajouté, vous devez redéfinir l'écouteur après avoir ajouté l'élément.

Existe-t-il un moyen de contourner ce problème, afin de ne pas avoir à exécuter un bloc de code supplémentaire ?

2 votes

Une solution js vanille : stackoverflow.com/a/27373951/1385441

208voto

Jack Points 6960

Utilisation de .on() vous pouvez définir votre fonction une fois, et elle s'exécutera pour tous les éléments ajoutés dynamiquement.

par exemple

$('#staticDiv').on('click', 'yourSelector', function() {
  //do something
});

0 votes

Existe-t-il un moyen d'utiliser .on() sur des événements qui ne sont pas dans Jquery natif, c'est-à-dire que je dois l'utiliser avec un plugin Jquery.

0 votes

@Wiz : vous pouvez vous lier à n'importe quel événement

0 votes

@zerkms J'essaie de l'utiliser avec Hovercard, et $('.class').on('hovercard', function(){}) ; ne fonctionne pas, alors que la syntaxe habituelle est $('.class').hovercard(function(){}) ;

50voto

zerkms Points 105994
$(document).on('click', 'selector', handler);

click est un nom d'événement, et handler est un gestionnaire d'événement, comme une référence à une fonction ou une fonction anonyme function() {}

PS : si vous connaissez le nœud particulier auquel vous ajoutez des éléments dynamiques, vous pouvez le spécifier à la place de l'option document .

11 votes

N'utilisez pas $(document) . L'événement doit être lié au parent statique le plus proche.

7 votes

@Joseph Silber : J'ai ajouté PS pour cela. Et "ne pas utiliser" est trop catégorique. Il y a des cas valables pour l'utiliser (ne mentionnez même pas qu'il est spécifié dans la documentation de jquery : api.jquery.com/live )

6voto

user2589327 Points 21

Vous générez ces éléments de manière dynamique, de sorte que tout listener appliqué au chargement de la page ne sera pas disponible. J'ai modifié votre bidule avec la solution correcte. En fait, jQuery retient l'événement pour le lier ultérieurement en l'attachant à l'élément parent et en le propageant vers le bas à l'élément correct créé dynamiquement.

$('#musics').on('change', '#want',function(e) {
    $(this).closest('.from-group').val(($('#want').is(':checked')) ? "yes" : "no");
    var ans=$(this).val();
    console.log(($('#want').is(':checked')));
});

http://jsfiddle.net/swoogie/1rkhn7ek/39/

1voto

haotc92 Points 92

Lorsque vous ajoutez un nouvel élément avec des appels de plugins jquery, vous pouvez faire comme suit :

$('<div>...</div>').hoverCard(function(){...}).appendTo(...)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X