Estoy tratando de enviar una solicitud PUT en el evento de unload , sin embargo, la solicitud siempre se cancela.
Las respuestas aquí sugieren que es
no es posible: ¿Cómo realizar una llamada ajax en la descarga de la página?
posible: ¿Cómo envío una solicitud AJAX al descargar/salir de la página?
¿Puedo enviar una solicitud de AJAX al descargar? Si es así, ¿cómo puedo hacerlo sin que me cancele?
Nota: No me importa la respuesta, no necesito una respuesta. Solo necesito enviar información al servidor diciendo que la página se cerró sin controles de mantenimiento.
Todo lo que necesita hacer es hacer que la llamada ajax sea síncrona. De esa forma, el navegador esperará la respuesta antes de cerrar la ventana/pestaña y no se cancelará.
$(window).unload(function(){ $.ajax({ type: 'PUT', url: '/your_url.php', async:false, //IMPORTANT, the call will be synchronous data: {} }).done(function(data) { console.log('complete'); }); });Los navegadores están deshabilitando activamente la realización de llamadas ajax estándar en un controlador de descarga de página, porque esperar a que se complete retrasa lo siguiente que sucede en la ventana (por ejemplo, cargar una nueva página). Aunque no puede hacer PUT con él, el reemplazo de ajax síncrono en los controladores de descarga es sendBeacon . sendBeacon le permite enviar datos a su servidor sin detener la página en la que lo está haciendo:
window.addEventListener("unload", function() { navigator.sendBeacon("/log", yourDataHere); });El navegador enviará los datos sin impedir/retrasar lo que esté pasando en la ventana (cerrarla, pasar a una nueva página, etc.).
Las balizas son POST, no PUT, pero aparte de eso, es exactamente lo que está buscando.
Tenga en cuenta que el evento de unload puede no ser confiable, particularmente en dispositivos móviles. También puede combinar lo anterior con el envío de una baliza sobre el cambio de visibilitychange .