2011-06-09 12 views
5

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(); 
} 

Respuesta

7

jQuery no proporciona una devolución de llamada para lo que estás buscando. Estos son los estados listos disponibles:

Value State Description 
0 UNSENT open()has not been called yet. 
1 OPENED send()has not been called yet. 
2 HEADERS_RECEIVED send() has been called, and headers and status are available. 
3 LOADING Downloading; responseText holds partial data. 
4 DONE The operation is complete. 

Usted está buscando readystate 2, ya que es la primera que está consciente del hecho de que el servidor ha recibido el mensaje.

Esto debe conseguir que fuera de la tierra:

var xhr = new XMLHttpRequest(); 
xhr.open("POST", clicked); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState >= 2) window.location = clicked; 
}; 
xhr.send($('#track-click-post-url').attr('value')); 

https://developer.mozilla.org/en/XMLHttpRequest para su posterior lectura.

+0

+1 para readyState, pero ¿continuará el servidor procesando la solicitud aunque abandone la página? –

+1

@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

+0

Ah, vale. Parece que esto puede funcionar. –

0

Al salir de una página, todos pendientes las solicitudes se eliminan y se carga la nueva página. La primera forma es la correcta. Sí, habrá un retraso cuando se haga clic en un enlace, eso se debe a que se está ejecutando la solicitud POST.

No se puede ejecutar una solicitud en el fondo de una página, si el usuario no está en esa página.

Quizás pueda guardar la URL del enlace en una cookie y ponerla en el DB cuando se cargue la página siguiente.

+1

Bueno, realmente no sé si las transacciones se completan o no. Quiero redirigirlos tan pronto como la solicitud se envíe al servidor, independientemente de lo que suceda después. No necesito recibir ningún tipo de respuesta. Por lo tanto, parece una pérdida esperar alrededor de esos .5 - 1.5 segundos. –

0

¿Por qué publicar usando Javascript cuando va a cargar una página de alguna manera?

Simplemente actualice el db con el enlace al que se hizo clic en la página nueva.

Quizás usando la URL de referencia para rastrear en qué página fue el clic.

O alguna otra solución para saber en qué página se hizo clic (por ejemplo, url param) o de alguna otra manera.

+0

Los enlaces son a páginas externas. Actualizaré la pregunta para aclarar eso. –

Cuestiones relacionadas