Estoy escribiendo una pequeña secuencia de comandos para capturar clics de enlaces y guardar la URL del enlace en una tabla de base de datos para hacer un seguimiento de cuántas veces se hace clic en cada enlace. Los enlaces son a sitios externos.La publicación AJAX se cancela mediante la redirección
Capturo el evento click en mi función de JavaScript, uso jQuery para publicar en una página PHP que guarda los datos en MySQL y luego la función de JavaScript redirige al usuario a la URL del enlace en el que hizo clic.
El problema que me estoy encontrando es que parece que la publicación nunca se completa debido a la redirección. He solucionado esto llamando a la redirección dentro de la devolución de llamada posterior, pero eso agrega unos segundos de retraso porque no se llama hasta después de que se complete la publicación. Estoy buscando una forma de publicar los datos y redirigir al usuario de inmediato, independientemente de si la publicación tiene éxito o no.
Este es el código actual con la solución alternativa. Funciona bien, pero agrega la demora:
function trackClicks(event)
{
var clicked = $(this).attr('href');
$.post
(
$('#track-click-post-url').attr('value'),
{
action: 'track_landing_page_clicks',
clicked_url: clicked,
nonce: $('#track-click-nonce').attr('value')
},
function(response)
{
window.location = clicked;
}
);
event.preventDefault();
}
Y esto es lo que me gustaría hacer, pero cuando lo intento nunca se completa:
function trackClicks(event)
{
var clicked = $(this).attr('href');
$.post
(
$('#track-click-post-url').attr('value'),
{
action: 'track_landing_page_clicks',
clicked_url: clicked,
nonce: $('#track-click-nonce').attr('value')
}
);
window.location = clicked;
event.preventDefault();
}
+1 para readyState, pero ¿continuará el servidor procesando la solicitud aunque abandone la página? –
@Rocket, se dispara después de que el servidor haya enviado los encabezados y el código de estado. Definitivamente es posible enviar los encabezados y códigos de estado antes de realizar la operación de SQL, pero a menos que específicamente lo haga, es seguro asumir que el servidor ha terminado con la solicitud cuando comienza a responder (¿De qué otra forma se sabría si necesita lanzar un 500 etc.). – Robert
Ah, vale. Parece que esto puede funcionar. –