jQuery.méthode live () vs. on () pour ajouter un événement de clic après le chargement du HTML dynamique

j'utilise jQuery v. 1.7.1 où le .la méthode live () est apparemment dépréciée.

le problème que j'ai est que lors du chargement dynamique html dans un élément en utilisant:

$('#parent').load("http://..."); 

si j'essaie d'ajouter un événement click par la suite, il n'enregistre pas l'événement en utilisant l'une de ces méthodes:

$('#parent').click(function() ...); 

ou

// according to documentation this should be used instead of .live()
$('#child').on('click', function() ...); 

comment réaliser cette fonctionnalité? Il ne semble de travailler avec .live() pour moi, mais je ne devrais pas utiliser cette méthode. Notez que #enfant est chargé dynamiquement élément.

Merci.

196
demandé sur Sean Thoman 2012-01-06 05:29:26

7 réponses

si vous voulez que le gestionnaire de clic fonctionne pour un élément qui est chargé dynamiquement, alors vous définissez le gestionnaire d'événements sur un objet parent (qui ne se charge pas dynamiquement) et lui donnez un sélecteur qui correspond à votre objet dynamique comme ceci:

$('#parent').on("click", "#child", function() {});

le gestionnaire d'événements sera attaché à l'objet #parent et à chaque fois qu'un événement de clic y fait des bulles qui proviennent de #child , il lancera votre gestionnaire de clic. Ceci est appelé délégué traitement des événements (le traitement des événements est délégué à un objet parent).

c'est fait de cette façon parce que vous pouvez attacher l'événement à l'objet #parent même si l'objet #child n'existe pas encore, mais quand il existe plus tard et qu'il est cliqué dessus, l'événement de clic va bulle jusqu'à l'objet #parent , il verra qu'il provient de #child et il y a un gestionnaire d'événement pour un clic sur #child et feu votre événement.

565
répondu jfriend00 2012-01-06 01:35:32

Essayez ce qui suit:

$('#parent').on('click', '#child', function() {
    // Code
});

De la $.on() de la documentation:

Les gestionnaires d'événements

ne sont liés qu'aux éléments actuellement sélectionnés; ils doit exister sur la page au moment où votre code fait l'appel à .on() .

votre élément #child n'existe pas lorsque vous appelez $.on() sur lui, donc l'événement n'est pas lié (contrairement à $.live() ). #parent , cependant, ne existent, de sorte liant l'événement à ce est très bien.

le deuxième argument de mon code ci-dessus agit comme un" filtre "pour déclencher seulement si l'événement a bubblé jusqu'à #parent de #child .

32
répondu Bojangles 2012-12-10 09:20:27

$(document).on('click', '#selector', function() { /* do stuff */ });

EDIT: je fournis un peu plus d'informations sur la façon dont cela fonctionne, parce que... mot. Avec cet exemple, vous placez un auditeur sur le document entier.

quand vous click sur n'importe quel élément correspondant à #selector , l'événement bulles jusqu'au document principal -- aussi longtemps qu'il n'y a pas d'autres auditeurs qui appellent la méthode event.stopPropagation() -- qui serait le dessus du bouillonnement 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 êtes à l'écoute de tout événement 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 que tous les éléments ajoutés dynamiquement.

c'est intelligent pour quelques raisons, y compris la performance et l'utilisation de la mémoire (dans les applications à grande échelle)

20
répondu lawrencealan 2016-12-09 19:41:07

L'équivalent de .live () en 1.7 ressemble à ceci:

$(document).on('click', '#child', function() ...); 

fondamentalement, regarder le document pour les événements de clic et les filtrer pour #enfant.

11
répondu Jared 2012-01-06 01:35:38

je sais qu'il est un peu tard pour une réponse, mais j'ai créé un polyfill pour le .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' .on () méthode dans la mesure du possible, mais dans les grands projets, où il n'est pas possible de tout convertir .live() appelle à l'équivalent .sur() appelle pour quelque raison que ce soit, les éléments suivants pourraient travailler:

if(jQuery && !jQuery.fn.live) {
    jQuery.fn.live = function(evt, func) {
        $('body').on(evt, this.selector, func);
    }
}

il suffit de l'inclure après avoir chargé jQuery et avant d'appeler vivre.)(

9
répondu NSV 2014-05-07 16:02:45

.on () est pour jQuery version 1.7 et supérieure. Si vous avez une version plus ancienne, utilisez ceci:

$("#SomeId").live("click",function(){
    //do stuff;
});
5
répondu Matt Cashatt 2012-01-06 01:31:21

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 ça, j'ai eu un problème comme toi.

sur mes pages, je crée dynamiquement des lignes de table de boutons et beaucoup de choses dom. 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 de faire que cela se reproduise et voici solution.

écrivez votre code comme:

function caller(){
    $('.ObjectYouWntToCall').on("click", function() {...magic...});
}

Caller(); après avoir créé votre objet dans la page comme ceci.

$('<dom class="ObjectYouWntToCall">bla... bla...<dom>').appendTo("#whereeveryouwant");
caller();

de cette façon, votre fonction est appelée quand elle n'est pas censée faire chaque clic sur la page.

3
répondu Coderx07 2013-07-30 09:21:15