À partir de jQuery 1.7 vous devez utiliser jQuery.fn.on
avec le paramètre du sélecteur rempli :
$(staticAncestors).on(eventName, dynamicChild, function() {});
Explication :
C'est ce qu'on appelle la délégation d'événements et cela fonctionne comme suit. L'événement est attaché à un parent statique ( staticAncestors
) de l'élément qui doit être traité. Ce gestionnaire jQuery est déclenché chaque fois que l'événement se déclenche sur cet élément ou sur l'un des éléments descendants. Le gestionnaire vérifie ensuite si l'élément qui a déclenché l'événement correspond à votre sélecteur ( dynamicChild
). Lorsqu'il y a une correspondance, votre fonction de traitement personnalisée est exécutée.
Avant cela l'approche recommandée était d'utiliser live()
:
$(selector).live( eventName, function(){} );
Cependant, live()
a été déprécié dans la version 1.7 en faveur de l'option on()
et complètement supprimé en 1.9. Le site live()
signature :
$(selector).live( eventName, function(){} );
... peut être remplacé par le texte suivant on()
signature :
$(document).on( eventName, selector, function(){} );
Par exemple, si votre page créait dynamiquement des éléments avec le nom de classe dosomething
vous lieriez l'événement à un parent qui existe déjà (c'est le cœur du problème, vous avez besoin de quelque chose qui existe pour vous lier, ne vous liez pas au contenu dynamique), cela peut être (et c'est l'option la plus simple) document
. Mais gardez à l'esprit document
peut ne pas être l'option la plus efficace .
$(document).on('mouseover mouseout', '.dosomething', function(){
// what you want to happen when mouseover and mouseout
// occurs on elements that match '.dosomething'
});
Tout parent qui existe au moment où l'événement est lié est parfait. Par exemple
$('.buttons').on('click', 'button', function(){
// do something here
});
s'appliquerait à
<div class="buttons">
<!-- <button>s that are generated dynamically and added here -->
</div>