2012-01-02 3 views
3

en Javascript .. Si j'ai un bouton généré dynamiquement et que je veux une fonction onClick générique. Comment puis je faire ça ? Je ne souhaite pas créer une fonction onClick unique pour chaque bouton. Comment puis-je en faire un seul qui s'applique à tous. Par exemple, affichez son texte d'étiquette lorsqu'il est pressé.Ajouter un événement onClick à des boutons générés dynamiquement?

+1

juste une suggestion: éviter de faire insérer plusieurs DOM dans une boucle . Faire une append() une fois si possibile, juste en dehors de la boucle. Ou - au moins - mettre en cache une référence à $ ('body') pour le bien de la performance – fcalderan

+0

Créé ce violon pour vous montrer d'autres façons de créer les boutons; http://jsfiddle.net/eacUJ/ – Stefan

Répondre

11

Vous pouvez le faire en utilisant une fonctionnalité Javascript appelé "événement bouillonnant". Les éléments ancêtres sont notifiés des événements sur leurs éléments descendants.

Dans ce cas, vous pouvez attacher un gestionnaire click à l'élément body et tous les clics sur ces boutons déclencheront un gestionnaire d'événements. La plus belle façon de le faire en jQuery est d'utiliser la méthode on:

$(document.body).on('click', 'button', function() { 
    alert ('button ' + this.id + ' clicked'); 
}); 

Cela fonctionne peu importe quand les éléments sont créés - avant ou après que les éléments ont été créés.

Cela fait exactement la même chose que la méthode live, mais live utilise on dans les coulisses et est beaucoup moins efficace et flexible.

+0

+1 pour la méthode on(). Je ne le savais jamais auparavant. J'ai beaucoup utilisé live(). Cela change tout. Merci –

+0

@AhmadAlfy C'est probablement parce que c'est un ajout récent à l'API, introduit dans v. 1.7.0. – lonesomeday

0

Vous pouvez utiliser une méthode en direct qui va lier l'écouteur d'événement aux éléments existants et ceux qui seront créés dans le futur. Cependant, cela peut être écrit avant ou après le code où les boutons ont été créés

$("button[id^=btnInit]").live("click", function(){ 
    // `this` is reference to each button separately - function will be called many times as how many buttons are 
    alert(this.id); 
}) 

En dernière version de jQuery, vous pouvez utiliser à la place à la fois bind et live une méthode on et au lieu unbing et die une méthode off.

Dans jQuery> = 1,7

$("body").on("click","button[id^=btnInit]", function(){ 
     // `this` is reference to each button separately - function will be called many times as how many buttons are 
     alert(this.id); 
    }) 
1

Si vous utilisez une version inférieure à jQuery 1.7, utilisez live()

$('input[name^="btnInit"]').live("click", function(){ 
    alert("clicked"); 
}); 

pour jQuery 1.7+, utilisez on()

$("body").on("click", "input[name^="btnInit"]", function(){ 
     alert("clicked"); 
}); 
Questions connexes