2010-02-03 7 views
0

Dans mon backend, j'utilise jquery 1.4.1 et l'interface utilisateur la plus récente 1.8rc1. J'ai défini un couple de boutons qui font des choses ... l'un est de créer un certain type de page en utilisant des fonctions de sérialisation appelant un fichier php, puis en rechargeant la page entière. localement cela fonctionne toujours comme un charme! mais dès que je l'ai mis sur mon serveur web, cela ne fonctionne que dans 5% des cas. Heres le code:jQuery AJAX timing issue

buttons: { 
'Seite erstellen': function() { 
$.post("webadmin/pages.create.serialize.php",$("#page-form").serialize()); 
$(this).dialog('close'); 
location.reload(true); 
}, 
'Abbrechen': function() { 
$(this).dialog('close'); 
} 
}, 

Là où ça devient intéressant, quand je mets une alerte juste avant la partie location.reload - il sera toujours travailler. Il semble donc y avoir un problème de synchronisation que la sérialisation est exécutée mais ne peut pas terminer avant que la page ne se recharge. Je sais que le sens de l'utilisation de la sérialisation n'est pas d'avoir à recharger la page, mais je construis une navigation etc., donc j'ai besoin de recharger. (en y réfléchissant maintenant ... je pourrais vraiment sérialiser tout ... de toute façon) Y a-t-il une solution simple à cela? Y at-il quelque chose comme un petit minuteur que je pourrais intégrer pour le faire attendre jusqu'à ce que la sérialisation soit terminée? Est-ce un comportement normal?

Répondre

1

Vous devez profiter de la fonction de rappel dans la méthode .post de $():

$.post(
     "webadmin/pages.create.serialize.php", 
     $("#page-form").serialize(), 
     function(data, textStatus, xhr) { 
      alert("I'm done loading now!"); 
     } 
); 

Pas exactement ce que « ce » fait référence à l'intérieur de la fonction de rappel, donc je vais laisser la mise en œuvre un exercice pour le lecteur. : ")

+0

" this "fait référence à l'objet de dialogue dont fait partie l'objet buttons. Donc, pour être correct, il aurait besoin de définir quelque chose comme "var self = this"; à l'intérieur de la boîte de dialogue mais en dehors du rappel, puis utilisez "self" au lieu de "this" dans le rappel. –

+0

Merci, j'allais le suggérer mais je me suis demandé s'il y avait une meilleure façon d'éviter le var x = ce bit. – roufamatic

+0

Merci - que tout fonctionne comme un charme maintenant! Et j'ai décidé de quitter le rechargement tous ensemble et mettre à jour tous les divs dans le rappel! –