2017-09-14 2 views
-2

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é?

+0

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. –

+0

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 ... –

+0

: 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. –

Répondre

-1
// Insted of this click, you can use below click function 

$('.remove_check').on('click', function() { 
    alert($(this).data('contribution-id')); 
    }); 


    $(document).on('click','.remove_check', function() { 
      alert($(this).data('contribution-id')); 
     }); 

Remarque: - utilisez la délégation d'événements pour les éléments créés dynamiquement.

Pour plus de détails, allez here

-1

Votre estimation est correcte, bien sûr. Vous pouvez ...

  • retard l'ajout de l'auditeur avec setTimeout
  • utilisation onclick pour déclencher le funtion
  • ajouter l'auditeur dans la fonction de succès de la demande ajax

Tous ceux-ci devraient faire travailler l'auditeur.