2013-07-04 10 views
5

Quindi c'è un modulo che voglio inviare solo quando una condizione viene verificata dal database usando ajax. Sto usando il metodo preventDefault() se la condizione è vera, vale a dire se un utente non è residente, una variabile è impostata su true in ajax successs function e preventDefault() viene chiamata, tuttavia, quando lo fa, il modulo viene sempre inviato. Non aspetta che l'ajax finisca anche quando async è impostato su false. Ecco il codice.Come fare un modulo attendere che ajax finisca prima di inviarlo?

$('#button').click(function(e) {  
    if ($('#ca_resident').prop('checked') == true) { 
     amount=$('#user-amount').val().replace(/[,]/g,""); 
     project_name=$('#project_name').val(); 
     var not_resident = false; 
     $.ajax({ 
     url: '/main/verify_residence/', 
     type: 'POST', 
     aysnc: false, 
     data: { 
      value: amount, 
      name: project_name 
     }, 
     success: function(data){ 
      $("#verify_residence").html(data); 
      not_resident = true; 
     }, 
     dataType: 'html' 
     }); 
    } 
    if(not_resident){ 
     e.preventDefault(); 
    } 
    }); 
+0

evitare il default prima di chiamare l'Ajax e il 'ajax.success' è quindi possibile' 'form.submit – Vogel612

+0

ritorno Try() false; invece di e.preventDeafult(). –

+1

@ Vogel612 Ho provato a farlo prima. questo impedisce alla forma di sottomettersi in qualsiasi condizione. Il modulo dovrebbe inviare quando un utente non fallisce il controllo di residenza – user2488801

risposta

4

che non funzionerà. Il successo sparerà dopo:

if(not_resident){ 
     e.preventDefault(); 
    } 

Come è asincrona. È necessario annullare sempre il tasto scatto poi inviare il modulo una volta il successo è colpito:

$('#button').click(function(e) {  
    var $form = $(this).closest('form'); 

    if ($('#ca_resident').prop('checked') == true) { 
     amount=$('#user-amount').val().replace(/[,]/g,""); 
     project_name=$('#project_name').val(); 
     $.ajax({ 
     url: '/main/verify_residence/', 
     type: 'POST', 
     aysnc: false, 
     data: { 
      value: amount, 
      name: project_name 
     }, 
     success: function(data){ 
      $("#verify_residence").html(data); 
      $form.submit(); 
     }, 
     dataType: 'html' 
     }); 
    } 


    e.preventDefault(); 

    }); 
+0

grazie Liam, ma quello che mi serve è se un utente non riesce a condizione di residenza il modulo non presenta, esattamente di fronte. 'e.preventDefault()' nella 'funzione successo'. ancora senza fortuna – user2488801

+0

@ user2488801 questo lo farà, se il 'successo' non viene colpito. il modulo non verrà inviato. 'e.preventDefault();' interrompe il modulo che invia sempre. '$ form.submit();' solo post in caso di successo di 'success' – Liam

+0

' success' è un caso in cui un utente fallisce la convalida e non gli è permesso di vedere oltre, cioè di non inviare alcun modulo. – user2488801