2010-10-13 5 views
2

J'ai un problème javascript inhabituel, j'ai un problème javascript qui refuse alternativement de travailler. En gros, le premier clic, la fonction jquery fonctionne comme il se doit, la suppression de la ligne de table et de redessiner les lignes de la table:comportement jquery incohérent

$(".deleteRow").click(function(e){ 
       if(confirm("This will delete the selected week. Are you sure?")){ 
        $.ajax({ 
         type: 'POST', 
         url: 'http://localhost/todo/index.php/home/ajax_delete', 
         data: { page_id : $(this).attr('id') }, 
         success: tableRedraw, 
         dataType: 'html' 
        }) 
       }; 
       e.preventDefault(); 
       }) 

cependant, si je clique sur le bouton qui déclenche cette fois, cela ne fonctionne pas. Au lieu de passer par la fonction javascript, il suit le lien (conçu pour le mode non javascript). Je ne comprends pas ce comportement inhabituel, j'aurais pu penser qu'il était causé par la source jquery n'étant pas disponible (pour une raison inconnue) mais j'ai une autre fonction qui ajoute des lignes à la table, qui peut être utilisé plusieurs fois de suite sans problèmes:

$("#addRow").click(function(e){ 
       $.ajax({ 
         type: 'POST', 
         url: 'http://localhost/todo/index.php/home/ajax_add', 
         success: tableRedraw, 
         dataType: 'html' 
        }) 
       e.preventDefault(); 
       }) 
      }) 

toute aide serait grandement appréciée.

Répondre

3

Je suppose que cela a à voir avec votre méthode tableRedraw. Si elle détruit réellement la table et redessine l'ensemble, vous détruisez également toute référence aux gestionnaires d'événements gérés par jQuery.

Je suppose que la raison pour laquelle #addRow continue de fonctionner est que cela ne fait pas partie de la table qui est redessinée, ou est en quelque sorte épargné d'être détruit. Je ne connais pas vos exigences de code, mais il serait inutile de détruire et de redessiner une table entière juste pour ajouter/supprimer une ligne (si c'est effectivement le cas). Au lieu de cela, il semblerait préférable de cibler uniquement la rangée individuelle qui a besoin de manipulation.

+0

place sur, je ne savais pas que les éléments dynamiques n'ont pas répondu aux mêmes gestionnaires. +1 pour identifier le problème – richzilla

+0

@richzilla - Oui, lorsque vous attachez un gestionnaire à un élément, il reçoit en fait un numéro de série qui référence ses gestionnaires. Lorsque vous détruisez des éléments, vous devez faire attention à la façon dont vous le faites, car ces derniers s'attarderont s'ils ne sont pas nettoyés. Cela pourrait être une énorme fuite de mémoire dans votre cas. Je vous suggère fortement de réévaluer la fonction 'tableRedraw'. Tandis que des méthodes comme '.live()' ou '.delegate()' peuvent (en quelque sorte) résoudre le problème, vous ne devriez vraiment pas détruire des éléments uniquement pour les recréer. Il y a souvent une façon différente/meilleure. – user113716

2

Est-ce que votre tableRedraw supprime les éléments (avec la classe deleteRow classe) et les recréer?

le cas échéant, vous devez utiliser la méthode .live() pour lier l'événement click, car il persistera à des éléments dynamiquement ajouté ..

mise à jour

vous devez changer la

$(".deleteRow").click(function(e){ 

à

$(".deleteRow").live('click', function(e){ 
+0

donc dans mon cas, si mes lignes de table ont une classe de semaine, id suffit d'ajouter à mon code: $ (". Week"). Live ('click') ;? – richzilla

+0

@richzilla, mise à jour de réponse avec exemple par rapport à la question d'origine. –

Questions connexes