2012-07-03 11 views
5

Tengo un juego Flash que intento salvar el estado de cuando el usuario cierra la pestaña del navegador. Se está utilizando el siguiente código de jQuery:¿Cómo hacer una solicitud de descarga de ventanas entre navegadores?

//Called from Flash when window closes 
function sendRequest(url, params) { 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: url, 
     data: params 
    }) 
} 

$(window).unload(function() { 
    //Make Flash attempt to save the game when the window closes. 
    //Flash gets the necessary data and calls sendRequest() 
    document["flashGame"].saveBeforeUnload(); 
}); 
  • Firefox: funciona correctamente
  • Chrome: funciona correctamente cuando recarga pero no cuando lengüetas de cierre o cerrar el navegador
  • IE (todas las versiones): no funciona en absoluto

wan Para que funcione en todos los navegadores correctamente, pero lo más importante es Chrome (no muchos de nuestros usuarios tienen IE).

Flash está llamando correctamente sendRequest (en todos los navegadores, probados con una alerta), por lo que no creo que los problemas provengan de Flash, pero podría ser.

+1

No creo que pueda ni creo que deba confiar en .unload, si el usuario desea cerrar el navegador, quiere cerrar el navegador. ¿Su pedido tarda más de unos pocos minutos en guardarse si el navegador espera? ¿Por qué no guardar el juego en decir un temporizador de 30 segundos para que el mayor tiempo que estarán fuera de 30 segundos, entonces usted no tiene que preocuparse por el evento de descarga – dstarh

+0

@dstarh: Ya guardamos el juego en un temporizador. El objetivo de esto es evitar que los jugadores pierdan esos últimos segundos de acciones. A menudo, esas últimas acciones son importantes. – Fragsworth

+1

por lo que está diciendo que una persona que hace clic en la X para cerrar la ventana de su navegador debe esperar que todo lo que haya hecho en los últimos segundos se guarde? Creo que entrenar al usuario para que haga clic en un botón para guardar y luego cerrar el navegador es tiempo mejor utilizado.Necesitamos sacar a los usuarios de la mentalidad de "Saqué el cable de alimentación de la pared, ¿por qué no se salvó todo ???? !!!" – dstarh

Respuesta

6

La respuesta corta es que no se puede.

El evento onbeforeunload fue presentado inicialmente por Microsoft para permitir un diálogo de confirmación estándar. Ahora es admitido en la forma original por la mayoría de los navegadores y en la mayoría de los casos se permite la ejecución de una función corta, no interactiva (por ejemplo, puede registrar su estado en localStorage). Pero, como se describe en the cross-browser jQuery API, esto no es fiable:

El manejo exacto del evento de descarga ha variado desde la versión de versión de los navegadores. Por ejemplo, algunas versiones de Firefox activan el evento cuando se sigue un enlace, pero no cuando la ventana está cerrada. En el uso práctico de , el comportamiento debe probarse en todos los navegadores admitidos, y en contraste con el evento previo de propiedad exclusiva.

Como hay muchos problemas de seguridad potenciales relacionados con la ejecución de una tarea cuando el usuario pidió poner fin a la página (y por lo tanto el guión), esto probablemente sea poco fiable hasta que (y si) un esfuerzo de normalización grave es hecho para precisar qué se puede hacer exactamente en una devolución de llamada onbeforeunload.

Para el futuro previsible, se recomienda no depender de onbeforeunload, sino de utilizar otros esquemas, por ejemplo, guardar el fondo constantemente o un gran botón "guardar".

1

Probar window.onbeforeunload. He encontrado esto en el jQueryBug Tracker como una posible solución:

window.onbeforeunload = function() { return "text"; } 
Cuestiones relacionadas