JQuery DataTables – Problème récursif fnDrawCallback

Donc, dans mon datatable, j’ai des boutons qui permettent à l’enregistrement d’être édité. J’utilise JQuery pour styler et donner des fonctions au clic du bouton. Le seul moyen d’obtenir l’application de la requête JQuery aux boutons consiste à insérer le code dans l’option fnDrawCallback de la table. Cependant, cela provoque plusieurs instances des fonctions! Par exemple, juste pour tester je crée une alerte pour me donner l’identifiant du bouton (qui est l’identifiant d’enregistrement) lorsque le bouton est cliqué. Et au lieu de simplement m’avertir UNE FOIS, cela me donne plusieurs alertes!

Des idées?

* En remarque, j’ai essayé de déclarer les fonctions à l’intérieur de l’option fnInitComplete mais cela ne s’applique qu’à la première série d’enregistrements affichée (10). Une fois que je montre plus d’enregistrements ou que je passe à la page suivante, les fonctions ne fonctionnent pas sur ces enregistrements.

var tfTable = $('.mypbhs_truforms').dataTable({ "bProcessing": true, "sAjaxSource": 'sql/mypbhs_truforms.php?accountid=', "aaSorting": [[ 1, "asc" ]], "bJQueryUI": true, "sPaginationType": "full_numbers", //"bStateSave": true, //Use a cookie to save current display of items "aoColumns": [ {"asSorting": [ ], "sClass":"center"}, null, null, null, null, null, {"asSorting": [ ], "sClass":"center"}, ], "fnDrawCallback": function(){ //EDIT OFFICE FORM $('.mypbhs_edit_truform_button').click(function(){ var tf_id = $(this).attr('id'); alert(tf_id); }); }, "bScrollCollapse": true, "sScrollX": "100%", "fnInitComplete": function() { tfTable.fnAdjustColumnSizing(); } }); 

Ok, donc trouvé un moyen de contourner cela. Utilisation de la fonction .on de JQuery pour toutes les fonctions que je plaçais dans l’option fnDrawCallback. Je suis curieux de savoir pourquoi utiliser fnDrawCallback crée plusieurs instances de la même fonction, bien que quiconque ait une réponse à cette question.

Où est-ce que .mypbhs_edit_truform_button vit? Si elle se trouve en dehors de la table brute elle-même, elle sera liée à chaque fois que la table sera redessinée. Étant donné que .on() fonctionne, il est probablement en mode délégué (car il ne peut s’agir que d’une traduction directe de .click ()).

Si vous vouliez le faire de la manière originale (bien que je pense que .on () est meilleur), y at-il une raison de ne pas le mettre dans le rappel InitComplete