javascript - w3school - Se puede usar antes de descargar/descargar para enviar XmlHttpRequests de forma confiable
title w3school (3)
Eche un vistazo a navigator.sendBeacon()
, que le permite enviar datos de manera confiable a un servidor incluso cuando la página se está descargando. Actualmente está en un borrador de especificación y es compatible con Firefox 31, Chrome 39 (detrás de una bandera de 37), detrás de una bandera en Opera 24.
Se podría "clasificar" por medio de algo como lo siguiente:
navigator.sendBeacon = navigator.sendBeacon || function (url, data) {
var xhr = new XMLHttpRequest();
// Need to send synchronously to have the best chance of data getting
// through to the server
xhr.open(''POST'', url, false);
xhr.send(data);
};
Otras lecturas:
Recientemente, tuve el requisito urgente de avisar a mi servidor, que una página específica de mi aplicación web está a punto de cerrarse. " Easy peasy ", pensé, antes de beforeunload
está disponible durante bastante tiempo. La "cosa" de HTML5 actualizó incluso la especificación (eso era lo que pensaba ...) al respecto, en la forma en que teníamos la opción de return
un valor de cadena de un controlador de eventos de beforeunload
y beforeunload
, lo que le da a un usuario la opción de interceptar.
Consulte la página de MDN acerca de onbeforeunload
de onbeforeunload
Sin embargo, resultó que no hay ninguna especificación " oficial " disponible, que describa el comportamiento de la beforeunload
anterior hasta esta fecha. El único documento oficial que encontré fue en WHATWG , que es solo una propuesta para el W3C, por supuesto.
Hasta ahora tan bueno. Podemos crear una solicitud XHR sincronizada dentro de un controlador de eventos de beforeunload
. La mayoría de los navegadores le dan a esa solicitud un período de tiempo de aproximadamente 1-2 segundos para que se complete, luego de eso se eliminará. Solicitud asíncrona estándar se eliminan de inmediato. Habiendo dicho eso, ni siquiera puedo decir de "dónde" lo sé, parece chisme y boca a boca mirándolo ahora. Aun así, funciona en Firefox + Chrome, no podemos confiar en eso, ¿podemos?
¿Hay alguna discusión / propuesta en curso sobre WHATWG acerca de la beforeunload
?
¿Algún otro recurso oficial sobre el evento que podría no haber encontrado?
Y lo que es más importante para mí aquí, ¿con qué fiabilidad podemos enviar datos a través de sync-XHR allí?
Lo que hay que tener en cuenta es que beforeunload
la beforeunload
inició como una extensión de Internet Explorer. Automáticamente, eso lo convierte en un ciudadano de segunda clase en la web. No hay especificación, y la implementación del navegador varía. Por ejemplo, Firefox solo lo implementa parcialmente al no mostrar la cadena, solo un mensaje genérico.
Además, incluso cuando está completamente implementado, no protege contra todos los posibles escenarios de descarga, por ejemplo, el usuario ha apagado el procesador, el navegador se ha bloqueado o se ha apagado la computadora. Incluso ignorando estos escenarios extremos, sospecho que podría ser posible configurar su navegador para ignorar tales solicitudes.
Mi sensación es que no debes confiar en este mensaje para salvarte. Si esta aplicación web es interna, sugeriría entrenarlos para usar los botones Save
o Close
o lo que sea, en lugar de simplemente cerrar la pestaña. Si es externo, tal vez busque en el ahorro automático ya que el usuario hace lo suyo.
Sync XHR es una fuente principal de bloqueos del navegador, que representa casi el 10% de los bloqueos: http://blogs.msdn.com/b/ieinternals/archive/2011/08/03/do-not-use-xmlhttprequest-in-synchronous-mode-unless-you-like-to-hang.aspx
En IE, incluso la sincronización XHR se puede "interrumpir" si la solicitud requiere viajes de ida y vuelta de autenticación de Windows, o si se envía un cuerpo POST. Es posible que solo se envíen los encabezados de la primera solicitud no autenticada.