2012-07-03 15 views
5

Ho un gioco Flash che sto cercando di salvare lo stato di quando l'utente chiude la scheda del browser. Sta usando il seguente codice jQuery:Come effettuare una richiesta di scaricamento su finestra-cross-browser?

//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: funziona correttamente
  • Chrome: funziona correttamente quando ricaricare ma non quando linguette di chiusura o la chiusura del browser
  • IE (tutte le versioni): non funziona affatto

I wan t per funzionare correttamente in tutti i browser, ma la cosa più importante è Chrome (non molti dei nostri utenti hanno IE).

Flash chiama correttamente sendRequest (in tutti i browser, testato con un avviso), quindi non credo che i problemi vengano da Flash, ma potrebbe.

+1

Non penso che tu possa o credo che dovresti fare affidamento su .load, se l'utente vuole chiudere il browser, vuole chiudere il browser. Se la tua richiesta richiede più tempo di alcuni ms per eseguire il salvataggio, il browser dovrebbe attendere? Perché non salvare il gioco su un timer di 30 secondi in modo che il più lungo sarà fuori è di 30 secondi, quindi non devi preoccuparti per l'evento di scarico – dstarh

+0

@dstarh: Abbiamo già salvare il gioco su un timer. Lo scopo di questo è impedire ai giocatori di perdere quegli ultimi secondi di azioni. Spesso quelle ultime azioni sono importanti. – Fragsworth

+1

quindi stai dicendo che una persona che fa clic sulla X per chiudere la finestra del browser dovrebbe aspettarsi che tutto ciò che hanno fatto negli ultimi secondi debba essere salvato? Penso che addestrare l'utente a fare clic su un pulsante di salvataggio e quindi chiudere il browser sia il tempo trascorso meglio.Dobbiamo eliminare gli utenti dalla mentalità di "Ho tirato il cavo di alimentazione dal muro, perché non è stato salvato tutto ???? !!! ???" – dstarh

risposta

6

La risposta breve è che non si può.

L'evento onbeforeunload è stato inizialmente introdotto da Microsoft per consentire una finestra di dialogo di conferma standard. Ora è supportato nella forma originale dalla maggior parte dei browser e nella maggior parte dei casi è consentita l'esecuzione di una funzione breve, non interattiva (ad esempio, è possibile registrare il proprio stato in localStorage). Ma, come descritto in the cross-browser jQuery API, questo non è affidabile:

La manipolazione esatta dell'evento scarico è variato da versione a versione di browser. Ad esempio, alcune versioni di Firefox attivano l'evento quando viene seguito un collegamento, ma non quando la finestra viene chiusa. Nell'uso pratico , il comportamento dovrebbe essere testato su tutti i browser supportati, e in contrasto con l'evento di download preliminare proprietario.

Come ci sono molti potenziali problemi di sicurezza legati alla esecuzione di un compito quando l'utente ha chiesto di porre fine alla pagina (e quindi lo script), questo sarà probabilmente inaffidabili fino (e se) un serio sforzo di normalizzazione è fatto per precisare cosa esattamente può essere fatto in un callback onbeforeunload.

Per il futuro prevedibile, si consiglia di non dipendere da onbeforeunload ma di utilizzare altri schemi, ad esempio un costante salvataggio in background o un grande pulsante "Salva".

1

Prova window.onbeforeunload. Ho trovato questo nel jQueryBug Tracker come una possibile soluzione:

window.onbeforeunload = function() { return "text"; } 
Problemi correlati