2009-08-11 14 views
5

Czy można wysłać żądanie ajax w onsubmit() formularza? Próbowałem tego, a wyniki są niestabilne, głównie dlatego, że prawdopodobnie jeśli przeglądanie zajmie więcej czasu, niż wysłanie mojego oryginalnego formularza, moje żądanie zostanie odrzucone, gdy tylko zmieni się lokalizacja załadowanej strony, więc czasami nigdy nawet nie trafi na serwer.Wysyłanie żądania Ajax przed wysłaniem formularza

Zasadniczo chcę dodać moduł zbierający dzienniki inspekcji, który zbiera zdarzenia logowania, chcę je podłączyć do istniejących aplikacji przy minimalnej inwazji.

+0

Jeśli używasz określonej struktury JavaScript dla żądania AJAX, daj mi znać, a ja mogę podać bardziej szczegółową odpowiedź. –

Odpowiedz

18

Jest to łatwo osiągalne. Po prostu wstrzymaj przesyłanie formularzy do czasu zakończenia żądania AJAX.

Utwórz swój formularz onsubmit, wywołaj funkcję AJAX i zwróć wartość false (co powoduje anulowanie przesyłania formularza). Po zakończeniu wywołania AJAX prześlij formularz programowo.

Na przykład:

<form name="myform" onsubmit="javascript: startAjax(); return false;"> 
... 
<script type="text/javascript"> 
function startAjax() {} // Calls ajaxComplete() when finished 

function ajaxComplete() 
{ 
    document.myform.submit(); 
} 
</script> 
+1

Co zrobić, jeśli nie jestem zainteresowany wynikiem żądania Ajax i chcę przesłać formularz, natychmiast po wysłaniu żądania Ajax? Czy nadal mogę korzystać z tego podejścia i wykonać jawny formularz do przesłania w samej funkcji 'startAjax()'? –

+0

czy to nie zmieni się w pętlę? –

0

Nie ma innego sposobu, aby rozwiązać ten problem, to można dokonać wywołania AJAX jako synchroniczny.

Przykład:

xmlhttp.open("GET", imageUrlClickStream, false); 

Dzięki temu możemy mieć pewność, że złożenie formularza będzie czekać aż do wywołania AJAX uzyskać odpowiedź.

+0

Chociaż może to działać, jest to bardzo słaba praktyka. Wykonanie żądania synchronicznego blokuje wykonanie strony, ponieważ przeglądarka musi czekać na odpowiedź, aby kontynuować wykonywanie dowolnego innego kodu JavaScript. – HoLyVieR

0

Zamień onsubmit na onclick to działa dobrze dla mnie, ponieważ onsubmit będzie w pętli.

<form name="myform" onclick="javascript: startAjax(); return false;"> 
... 
<script type="text/javascript"> 
function startAjax() {} // Calls ajaxComplete() when finished 

function ajaxComplete() 
{ 
    document.myform.submit(); 
} 
</script> 
Powiązane problemy