Depuis jQuery 1.7, vous devez utiliser jQuery.fn.on
:
$(staticAncestors).on(eventName, dynamicChild, function() {});
Avant cela , l'approche recommandée consistait à utiliser live()
:
$(selector).live( eventName, function(){} );
Cependant, a live()
été déprécié en 1.7 en faveur de on()
, et complètement supprimé en 1.9. La live()
signature:
$(selector).live( eventName, function(){} );
... peut être remplacé par la on()
signature suivante :
$(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 nœud du problème ici, vous avez besoin de quelque chose qui existe pour se lier, ne vous liez pas au contenu dynamique), cela peut être (et l'option la plus simple) l'est document
. Cependant, n'oubliez document
pas que l'option n'est pas 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é va bien. 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>
Il y a une bonne explication dans la documentation de
jQuery.fn.on
.En bref:
Ainsi, dans l'exemple suivant, il
#dataTable tbody tr
doit exister avant la génération du code.Si un nouveau code HTML est injecté dans la page, il est préférable d'utiliser des événements délégués pour attacher un gestionnaire d'événements, comme décrit ci-dessous.
Les événements délégués ont l'avantage de pouvoir traiter les événements des éléments descendants qui sont ajoutés au document ultérieurement. Par exemple, si la table existe, mais que les lignes sont ajoutées dynamiquement à l'aide de code, les éléments suivants la géreront:
En plus de leur capacité à gérer des événements sur des éléments descendants qui ne sont pas encore créés, un autre avantage des événements délégués est leur potentiel de surcharge beaucoup plus faible lorsque de nombreux éléments doivent être surveillés. Sur une table de données contenant 1 000 lignes
tbody
, le premier exemple de code attache un gestionnaire à 1 000 éléments.Une approche par événements délégués (le deuxième exemple de code) attache un gestionnaire d'événements à un seul élément
tbody
, et l'événement n'a besoin de remonter que d'un niveau (du clictr
verstbody
).Remarque: les événements délégués ne fonctionnent pas pour SVG .
la source
tr
pour un sélecteur approprié, comme'input[type=checkbox]'
, et cela serait automatiquement géré pour les lignes nouvellement insérées?Il s'agit d'une solution JavaScript pure sans bibliothèques ni plugins:
où
hasClass
estLive demo
Nous remercions Dave et Sime Vidas
L'utilisation de JS plus modernes
hasClass
peut être implémentée comme:la source
Element.classList
n'est pas pris en charge pris en charge sur les anciens navigateurs. Par exemple, IE <9.Vous pouvez ajouter des événements aux objets lorsque vous les créez. Si vous ajoutez les mêmes événements à plusieurs objets à des moments différents, la création d'une fonction nommée peut être la voie à suivre.
la source
Vous pouvez simplement envelopper votre appel de liaison d'événement dans une fonction, puis l'invoquer deux fois: une fois sur le document prêt et une fois après votre événement qui ajoute les nouveaux éléments DOM. Si vous faites cela, vous voudrez éviter de lier deux fois le même événement aux éléments existants, vous aurez donc besoin de dissocier les événements existants ou (mieux) de ne vous lier qu'aux éléments DOM nouvellement créés. Le code ressemblerait à ceci:
la source
Essayez d'utiliser
.live()
au lieu de.bind()
; le.live()
sera lié.hover
à votre case à cocher après l'exécution de la demande Ajax.la source
live()
été déconseillée dans la version 1.7 au profit deon
et supprimée dans la version 1.9.Liaison d'événement sur des éléments créés dynamiquement
Élément unique:
Élément enfant:
Remarquez l'ajout
*
. Un événement sera déclenché pour tous les enfants de cet élément.Je me suis rendu compte que:
Cela ne fonctionne plus, mais cela fonctionnait auparavant. J'utilise jQuery de Google CDN , mais je ne sais pas s'ils l'ont changé.
la source
Vous pouvez utiliser la méthode live () pour lier des éléments (même nouvellement créés) à des événements et des gestionnaires, comme l'événement onclick.
Voici un exemple de code que j'ai écrit, où vous pouvez voir comment la méthode live () lie les éléments choisis, même nouvellement créés, aux événements:
la source
Je préfère utiliser le sélecteur et je l'applique sur le document.
Cela se lie au document et sera applicable aux éléments qui seront rendus après le chargement de la page.
Par exemple:
la source
selector
variable, quand il doit contenir une chaîne ou un objet Element que vous pouvez simplement passer directement à cet argument deon()
Une autre solution consiste à ajouter l'écouteur lors de la création de l'élément. Au lieu de placer l'écouteur dans le corps, vous placez l'écouteur dans l'élément au moment où vous le créez:
la source
myElement.append('body');
doit l'êtremyElement.appendTo('body');
. D'un autre côté, s'il n'est pas nécessaire d'utiliser davantage la variable,myElement
c'est plus facile et plus court de cette façon:$('body').append($('<button/>', { text: 'Go to Google!' }).bind( 'click', goToGoogle));
Essayez comme ça -
la source
Prenez note de la classe "MAIN" l'élément est placé, par exemple,
Dans le scénario ci-dessus, l'objet MAIN que jQuery surveillera est "conteneur".
Ensuite , vous aurez essentiellement des noms des éléments sous conteneur tel
ul
,li
etselect
:la source
Cela se fait par délégation d'événement . L'événement sera lié à l'élément de classe wrapper mais sera délégué à l'élément de classe sélecteur. Voilà comment cela fonctionne.
Remarque:
L'élément wrapper-class peut être n'importe quoi ex. document, corps ou votre emballage. Wrapper devrait déjà exister . Cependant,
selector
ne doit pas nécessairement être présenté au moment du chargement de la page. Cela peut arriver plus tard et l'événement se lieraselector
sans échec .la source
tu pourrais utiliser
ou
ces deux méthodes sont équivalentes mais ont un ordre de paramètres différent.
voir: événement jQuery Delegate
la source
delegate()
est désormais obsolète. Ne l'utilise pas.Vous pouvez attacher un événement à l'élément lors de sa création dynamique à l'aide de
jQuery(html, attributes)
.la source
Voici pourquoi les éléments créés dynamiquement ne répondent pas aux clics:
Pour contourner ce problème, vous devez écouter tous les clics et vérifier l'élément source:
C'est ce qu'on appelle la "délégation d'événement". Bonne nouvelle, c'est une fonctionnalité intégrée à jQuery :-)
la source
Tout élément existant au moment où l'événement est lié et si votre page créait dynamiquement des éléments avec le bouton de nom de classe, vous lieriez l'événement à un parent qui existe déjà
la source
Liez l'événement à un parent qui existe déjà:
la source
Utilisez la
.on()
méthode de jQuery http://api.jquery.com/on/ pour attacher des gestionnaires d'événements à l'élément live.Également à partir de la version 1.9, la
.live()
méthode est supprimée.la source
Je préfère que les écouteurs d'événements soient déployés de manière modulaire plutôt que de créer un script pour un
document
écouteur d'événements de niveau. Donc, j'aime ci-dessous. Notez que vous ne pouvez pas sursouscrire un élément avec le même écouteur d'événements, alors ne vous inquiétez pas d'attacher un écouteur plus d'une fois - un seul bâton.la source
Une autre solution flexible pour créer des éléments et lier des événements ( source )
Remarque: Cela créera une instance de gestionnaire d'événements pour chaque élément (peut affecter les performances lorsqu'il est utilisé dans des boucles)
la source
la source
Je cherchais une solution pour obtenir
$.bind
et$.unbind
travailler sans problème dans des éléments ajoutés dynamiquement.Comme on () fait l'astuce pour attacher des événements, afin de créer un faux lien sur ceux auxquels je suis venu:
la source