2009-02-07 7 views
3

J'essaie d'envoyer des données d'un formulaire à un script externe avant de soumettre le formulaire, mais je n'arrive pas à obtenir les données pour atteindre le script externe, sauf si je return false; sur le formulaire lui-même.

$(document).ready(function() { 

    // Handle Form-Submission 
    $("#mainForm").submit(function() { 

    // Reset Error Array 
    errors = new Array(); 

    /* Validation Code Removed - Not Relevant */   

    // Check if errors exist 
    if (errors.length > 0) { 
     return false; 
    } else { 
     $("div.errors").html(""); 
     $.post("post.php",{ 
     "First Name": name_first.val(), 
     "Last Name": name_last.val(), 
     "Home State": home_state.val(), 
     "Primary Email": email_primary.val() 
     }); 
    } 
    return false; /* Remove this line, and the $.post won't work. */ 
    }); 
}); 
+0

Qu'est-ce que vous essayez exactement de faire? Attendez la fin du $ .post, puis envoyez le formulaire? –

+0

J'envisage ça, Paolo. Fondamentalement, je veux enregistrer les données sans interrompre le flux de l'application. Si Javascript est désactivé, j'aimerais quand même que le formulaire fonctionne. Mais si c'est activé, je voudrais passer les données dans un script PHP. – Sampson

+0

Peut-être devrais-je changer $ ("# mainForm"). Submit() en $ ("# submitButton"). Click() puis soumettre le formulaire dans la fonction de rappel? – Sampson

Répondre

8

J'ai rencontré exactement le même problème aujourd'hui. Comme Marc le dit, c'est parce que l'appel ajax est asynchrone. La solution la plus simple est de le rendre synchrone.

Utilisation .ajaxSetup() avant tout appel ajax comme tels:

$.ajaxSetup({async: false}); 
+0

Ça marche! Sensationnel. J'aime StackOverflow. Passez 2 heures à travailler sur un problème et obtenez la réponse dans les 10 minutes qui suivent son affichage ici. – Sampson

+2

Faites juste attention à synchrone - il va bloquer l'interface utilisateur jusqu'à ce que le POST revient! –

+0

Certainement, c'est seulement pour être utilisé dans un scénario où vous voulez bloquer l'interface utilisateur. En toute sécurité, pour que votre événement click/submit renvoie true par défaut, les navigateurs non-Javascript fonctionneront toujours correctement. –

2

Envoi à deux points d'extrémité

Je voudrais essayer quelque chose comme ça au lieu d'utiliser async: true. Bien qu'il soit nettement plus compliqué, il ne gèlent pas l'interface .:

$(document).ready(function(){   
    // Handle Form-Submission 
$("#mainForm").submit(function(e){ 
    e.preventDefault(); 
    var $form = $(this); 

    if($form.data('submitting')) return; // Avoid double submissions 
    $(':submit').attr('disabled','disabled'); // Disable the submit button 

    // Reset Error Array 
    errors = new Array(); 

    /* Validation Code Removed - Not Relevant */   

    // Check if errors exist 
    if (errors.length > 0) {; 
     $(':submit').removeAttr('disabled'); // Enable the submit button 
     return false; 
    } else { 
     $("div.errors").html(""); 
     $form.data('submitting',true); // Flag that a submission has started 
     $.post("post.php",{ 
     "First Name":name_first.val(), 
     "Last Name":name_last.val(), 
     "Home State":home_state.val(), 
     "Primary Email":email_primary.val()}, 
     function(){ 
      // remove our special handler and submit normally 
      $form.unbind('submit').submit(); 
     } 
    ); 
    } 
    }); 
}); 

Réponse originale

Il semble que votre raccrochage est que vous voulez utiliser $.post si JavaScript est activé, mais laisser la forme fonctionne normalement avec JavaScript désactivé.

Cependant, depuis aucune de votre JavaScript fonctionnera si elle est désactivé vous n'avez pas à vous soucier de modifier le comportement de la fonction submit.

Vous pouvez laisser votre déclaration return false;, ou utiliser

$("#mainForm").submit(function(e){ 
    // all your existing code 

    e.preventDefault(); 
} 

qui gardera la forme de soumettre normalement et sera au lieu d'utiliser votre méthode $.post lorsque JavaScript est activé . Si c'est désactivé, il se présentera normalement.

preventDefault est préférable à return false si vous souhaitez que les bulles d'événements continuent normalement, mais que l'action par défaut du navigateur ne se poursuive pas. return false est l'équivalent de l'appel e.preventDefault(); e.stopPropagation();

Questions connexes