2013-07-04 22 views
5

Więc istnieje formularz, który chcę przesłać tylko wtedy, gdy warunek jest weryfikowany z bazy danych za pomocą ajax. Używam metody preventDefault(), jeśli warunek jest spełniony, tzn. Jeśli użytkownik nie jest rezydentem, zmienna jest ustawiana na wartość true w ajax successs function, a preventDefault() jest wywoływana, jednak w tym przypadku formularz zawsze przesyła. Nie czeka na zakończenie ajax, nawet jeśli async ma wartość false. Oto kod.Jak sprawić, aby formularz czekał, aż ajax się skończy, zanim zostanie przesłany?

$('#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

zapobiec domyślne przed wywołaniem ajax i 'ajax.success' Następnie można' form.submit() ' – Vogel612

+0

Try zamian fałszywy; zamiast e.preventDeafult(). –

+1

@ Vogel612 Próbowałem już to zrobić. to zapobiega przesyłaniu formularza w dowolnych warunkach. Formularz powinien złożyć, gdy użytkownik nie przejdzie kontroli rezydentnej – user2488801

Odpowiedz

4

która nie zadziała. Sukces będzie ogień po:

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

Jak to asynchroniczny. Trzeba zawsze anuluj kliknięcie następnie przesłać formularz po sukces jest hit:

$('#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

dziękuje Liam, ale to, czego potrzebuję, to jeśli użytkownik nie spełni warunku zamieszkania, formularz nie zostanie złożony, dokładnie przeciwnie. 'e.preventDefault()' w 'funkcji sukcesu'. nadal nie ma szczęścia – user2488801

+0

@ user2488801 zrobi to, jeśli 'success' nie zostanie trafiony. formularz nie zostanie przesłany. 'e.preventDefault();' zatrzymuje wysyłanie formularzy. '$ form.submit();' tylko posty, gdy 'sukces' jest trafiony – Liam

+0

' success' to przypadek, w którym użytkownik nie sprawdza poprawności i nie może widzieć dalej, tzn. nie przesyła formularza. – user2488801