2009-08-11 11 views
5

¿Es posible enviar una solicitud ajax en onsubmit() de un formulario? Lo he intentado y los resultados son escamosos, principalmente porque probablemente si el navegador tarda más en enviar mi solicitud que en enviar el formulario original, mi solicitud se descarta tan pronto como cambia la ubicación de la página cargada, por lo que a veces nunca llega al servidorEnviando una solicitud Ajax antes de enviar el formulario

Básicamente, lo que quiero hacer es agregar un recopilador de registro de auditoría que recopila eventos de inicio de sesión, quiero conectarlo a las aplicaciones existentes con una mínima invasión.

+0

Si está utilizando un marco de JavaScript específico para la solicitud de AJAX, hágamelo saber y le puedo dar una respuesta más específica. –

Respuesta

18

Esto es fácilmente realizable. Solo espere hasta que se complete la solicitud de AJAX.

Haga que su atributo de forma onsubmit llame a la función AJAX y devuelva falso (lo que cancela el envío del formulario). Cuando finalice su llamada AJAX, envíe el formulario de forma programática.

Por ejemplo:

<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

¿Qué sucede si no estoy interesado en el resultado de la solicitud de Ajax y deseo enviar el formulario inmediatamente después de enviar la solicitud de Ajax? ¿Puedo seguir usando este enfoque y enviar un formulario explícito en la función 'startAjax()'? –

+0

¿Esto no entrará en un ciclo? –

0

Hay otra manera de resolver este problema, es decir que pueda tomar la llamada AJAX como síncrono.

Ejemplo:

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

Por esto podemos garantizar que el envío del formulario esperará hasta que la llamada ajax obtener la respuesta.

+0

Si bien esto puede funcionar, es una práctica muy pobre. Hacer una solicitud sincrónica congela la ejecución de la página, porque el navegador tiene que esperar la respuesta para continuar ejecutando cualquier otro código JavaScript. – HoLyVieR

0

Reemplazar onsubmit con onclick, funciona bien para mí porque se envía en loop.

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

function ajaxComplete() 
{ 
    document.myform.submit(); 
} 
</script> 
Cuestiones relacionadas