ejecutar - llamar funcion javascript html sin evento
¿Se puede usar el evento de descarga para despedir de manera confiable la solicitud de ajax? (5)
Necesito un método para supervisar las sesiones de edición del usuario, y una de las soluciones que estoy revisando me obligará a utilizar un evento de unload
para enviar una solicitud ajax para informar al servidor del final de la sesión de edición. (Consulte: Supervisión de sesiones de usuario para evitar conflictos de edición )
Mi lectura (bastante limitada) sobre el evento de unload
indica que los códigos adjuntos a este controlador deben ejecutarse rápidamente, y como tal se usan generalmente para borrar objetos y evitar fugas de memoria.
Mi pregunta es, ¿puede esto funcionar de manera confiable para este propósito?
PD. Sé sobre la opción async: false
.
¿Has intentado usar
var i = new Image(1,1);
i.src=''http://...''
Y simplemente devolviendo una imagen vacía del servidor. Creo que debería ser confiable, el script bloqueará. Por cierto: es agradable agregar la fecha y hora para evitar el almacenamiento en caché.
Este método es bastante confiable, si su servidor es lo suficientemente rápido para responder. Algo para tener realmente cuidado sin embargo. Si cierra el navegador y envía la solicitud de AJAX al evento de descarga, hay muchas posibilidades de que la respuesta no vuelva del servidor a tiempo antes de que se destruya el objeto de la ventana. Lo que sucede en este caso (al menos con IE) es que huérfano su objeto de conexión y no terminarlo correctamente hasta que se llegue al tiempo de espera de la conexión. Si su servidor no tiene activada la conexión keep-alive, después de cerrar 2 ventanas (mientras aún tiene otra ventana abierta), se le acabarán las conexiones abiertas al servidor (para IE6-7, para IE8 - 6 ventanas) y no podrá abrir su sitio web hasta que se agote el tiempo de espera de su conexión.
Me encontré con una situación como esa antes de abrir una ventana emergente que enviaba una solicitud de AJAX para descargar, era muy confiable, pero estaba plagada por la emisión descrita anteriormente, y me tomó mucho tiempo seguirla abajo y entender lo que está pasando. Después de eso, lo que hice, es que me aseguré de que la ventana de apertura tuviera el mismo código para llamar al servidor, y en cada descarga se verificaba el abridor y se ejecutaba el código allí si estaba presente.
Parece que si cierra la última ventana del navegador, IE destruirá la conexión correctamente, pero si hay otra ventana abierta, no lo hará.
PD Y solo para comentar sobre la respuesta anterior, AJAX no es realmente asincrónico. Al menos la implementación de JS no lo es. Después de enviar una solicitud, su código JS seguirá esperando la respuesta del servidor. No va a bloquear la ejecución del código, pero dado que el servidor puede tardar un tiempo en responder (o el tiempo suficiente para que Windows rescinda el objeto de la ventana de IE), es probable que se encuentre con el problema descrito anteriormente.
Tenía un caso en el que solo tenía que notificar al servidor sobre la descarga y no me interesaba la respuesta.
Si ese es tu caso, puedes ignore_user_abort y luego sabrás que sucederá "de manera confiable"
Tendrá que hacer sus propias pruebas para ver si su escenario particular funciona o no con el tiempo que tiene para unload
, pero hacer la solicitud AJAX es bastante rápido, ya que AJAX es asincrónico. ¡Simplemente envía la solicitud y listo! (Tal vez tendrá que borrar el objeto de solicitud que acaba de crear, sin embargo).
Si quería verificar que la solicitud AJAX lo hizo, entonces tendría que preocuparse más / use la opción async:false
(como indica esta discusión ). Pero, solo enviar es una operación rápida de boom-y-ya está hecho.
Tenemos un caso donde lo necesitamos. Es una página de informe que necesita memoria seria en el servidor, por lo que queríamos liberarla tan pronto como salieran de la página. Creamos un conjunto de marcos y agregamos el controlador de descarga allí. La forma más confiable era establecer el src de una imagen en el script de liberación. De hecho, utilizamos tanto la descarga como antes de descargar para compatibilidad con navegadores cruzados. No funcionó en las colecciones nocturnas de los kits web, pero la administración estuvo de acuerdo con eso.
Sin embargo, esa no fue mi solución propuesta. Usaría un enfoque de latido que implica más trabajo pero es mucho más sólido.
Su página debe enviar solicitudes de latidos periódicos. Cada solicitud establece el último latido de una página. Luego necesita un hilo que se ejecuta en el servidor y borra la memoria si el último latido fue demasiado largo.
Esto no resuelve el problema de dejar la página abierta durante mucho tiempo. Para eso, necesitas un poco de supervisión para la actividad del usuario y abandonar esa página después de un período de inactividad (asegúrate de confirmar con el usuario)