Je reçois des données d'AJAX pour construire une table. Cette table aura un lien pour supprimer une ligne de la base de données. J'ai du mal à faire en sorte qu'un auditeur réagisse à un clic sur le lien "supprimer" du contenu généré.jquery catch event à partir d'un élément généré
<!-- contribId is populated initially from PHP -->
<input id="hidden-contrib-id" value="<?= $contribId ?>" />
<div id="checksEnteredContainer">
</div>
<script>
$(document).ready(function(){
// get data via ajax and build table
buildCheckEnteredTable($('#hidden-contrib-id').val());
// various listeners here...
$('.remove_check').on('click', function() {
alert($(this).data('contribution-id'));
});
});
/**
* Get checks from database
*/
function buildCheckEnteredTable(contribId) {
var url = "/path/to/script";
var response = $.post(url, {action: 'getChecks', contribId: contribId});
response.done(function(result) {
// build html table from the data
$('#checksEnteredContainer').html(buildTable(result));
}
function buildTable(data) {
var numberOfRows = data.length;
var rows='';
for(i=0; i<numberOfRows; ++i) {
rows += '<tr>' +
'<td>' + data[i].checkNumber + '</td>' +
'<td>' + data[i].amount + '</td>' +
'<td><a href="#" class="remove_check" data-contribution-id="' + data[i].checkId + '">remove</a></td>'
'</tr>';
}
var table = '<table class="table"><tr><th>Check Number</th><th>Amount</th><th></th></tr>' +
rows +
'</table>';
return table;
}
La création de la table fonctionne correctement et s'affiche dans le navigateur; ce qui ne fonctionne pas est l'écouteur pour la classe remove_check
.
Ma conjecture est que la table nouvellement créée n'est pas réellement dans le DOM et l'auditeur n'est pas au courant que la table existe? Quoi qu'il en soit, comment puis-je amener l'auditeur à répondre à un clic sur le lien généré?
Votre estimation est correcte, et il y a plusieurs façons de la gérer. L'une serait de mettre l'écouteur sur le parent '# hidden-contrib-id' et de gérer les changements sur ses éléments enfants puisque' hidden-contrib-id' est là quand votre page se charge, les écouteurs sont toujours là malgré les changements à l'intérieur d'elle. Ou vous pouvez envelopper vos écouteurs dans une fonction et les rattacher aux éléments dynamiques après les avoir mis à jour '$ ('# checksEnteredContainer'). Html (buildTable (result)); // Attacher divers écouteurs ici' Ou vous pourriez avoir un écouteur pour écouter les changements et attacher les écouteurs aux mises à jour, etc. –
oh, duh ... '.remove_check' n'existe pas quand l'écouteur est exécuté. Donc je devrais l'attacher à '# checksEnteredContainer'. Maintenant, pour vérifier le lien fourni ci-dessus ... –
: facepalm: '$ ('. Remove_check'). On ('clic', fonction() {' vs '$ (document) .on ('clic', '. remove_check ', function() {'Merci au lien référencé, je ne referai pas cette erreur. –