2009-11-30 16 views
60

que estoy tratando de hacer esto:petición Ajax con jQuery en la página descargar

$(window).unload(function() { 

$.ajax({ 
    type: "POST", 
    url: "http://localhost:8888/test.php?", 
    data: "test", 
    success: function(msg){ 
     alert("Data Saved: " + msg); 
    } 
}); 
alert (c); 
}); 

Sin embargo, la alerta se muestra el éxito nunca, ni esta solicitud parece estar incluso golpear el servidor. ¿Qué estoy haciendo mal?

+2

Ahh ... ahora entiendo por qué Google hizo su propio navegador, ya que un comportamiento confiable como este es tan crítico para su 'no ser malvado' –

Respuesta

0

Su función y la llamada Ajax se ven bien, así que supongo que la ventana del navegador está cerrada antes de que la llamada ajax tenga tiempo de ir al servidor y volver. La llamada AJAX podría devolver algo cuando la ventana se está cerrando, trate de añadir la función de error a su llamada AJAX para ver si ese es el caso:

error: function (xhr, textStatus) { 
    alert('Server error: '+ textStatus); 
} 
+1

Realmente no necesito que vuelva "atrás" (es decir, esa alerta de el éxito no es necesario, solo se usa con fines de depuración). Sin embargo, sí necesito la solicitud de ajax para ser despedido antes de que finalice la descarga. – Rob

70

Creo que usted necesita para hacer la petición síncrona lugar (es asíncrona de forma predeterminada) utilizando el parámetro async : false.

+0

Gracias. ¿Tienes alguna explicación de por qué esta debe ser sincrónica? – zigomir

+1

Las solicitudes sincrónicas bloquean el navegador hasta que se completen. Si la solicitud es asincrónica, la página continúa descargando. Es lo suficientemente rápido para que la solicitud nunca tenga tiempo de dispararse. –

+0

¿Esto significa que existe la posibilidad de que, si el navegador tarda demasiado en descargarse (tal vez en los problemas del disco duro), a veces se envíe la solicitud? O nunca es enviado. Sólo curioso. –

0

¿Tal vez tendría más éxito usando el evento onbeforeunload en su lugar?

$(window).bind('beforeunload', ... 
+1

El evento beforeunload no es compatible con Safari –

17

Intenta llamarlo con async = false;

jQuery.ajax({url:"http://localhost:8888/test.php?", async:false}) 

Acabo de intentarlo.

3

La especificación de HTML 5 indica que alert(), prompt(), etc. no estarán disponibles durante el evento window.unload(). Por favor, consulte window.unload() para más detalles. Puede verificar el resultado utilizando console.log('success'); en lugar de alert().

7

La mejor solución es usar navigator.sendBeacon. Es una funcionalidad completamente nueva que se está empezando a implementar en las nuevas versiones de navegadores. La función está disponible en navegadores más nuevos que Chrome 39 y Firefox 31. No es compatible con Internet Explorer y Safari en el momento de la escritura. Para garantizar que su solicitud se envía en los navegadores que no soportan la nueva funcionalidad sin embargo, puede utilizar esta solución:

var navigator.sendBeacon = navigator.sendBeacon || function (url, data) { 
    var client = new XMLHttpRequest(); 
    client.open("POST", url, false); // third parameter indicates sync xhr 
    client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8"); 
    client.send(data); 
}; 

Esta función no permite que se registre una devolución de llamada onSuccess sin embargo.

+1

Actualmente, esto sigue apareciendo como experimental y "la sintaxis y el comportamiento ... están sujetos a cambios en futuras versiones" –

Cuestiones relacionadas