2012-07-03 6 views
5

Ich habe ein Flash-Spiel, das ich versuche, den Zustand zu speichern, wenn der Benutzer den Browser-Tab schließt. Es wird mit dem folgenden jQuery-Code:Wie wird eine browserübergreifende On-Window-Unload-Anfrage erstellt?

//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: richtig funktioniert
  • Chrome: richtig funktioniert, wenn Nachladen aber nicht, wenn Verschlussklappen oder den Browser
  • Schließen des IE (alle Versionen): Funktioniert überhaupt nicht

ich wan Es funktioniert in allen Browsern richtig, aber am wichtigsten ist Chrome (nicht viele unserer Benutzer haben IE).

Flash ruft korrekt sendRequest (in allen Browsern, mit einer Warnung getestet), so glaube ich nicht, dass die Probleme von Flash kommen, aber es könnte.

+1

Ich glaube nicht, dass Sie können oder nicht denke ich, dass Sie sich auf .unload verlassen sollten, wenn der Benutzer den Browser schließen will, den sie den Browser schließen möchten. Sollte Ihre Anfrage länger als ein paar ms dauern, um den Speicher zu speichern, sollte der Browser warten? Warum speichern Sie das Spiel nicht auf einen 30-Sekunden-Timer, so dass die längste Zeit 30 Sekunden beträgt. Dann müssen Sie sich keine Sorgen um das Entlade-Ereignis machen. – dstarh

+0

@dstarh: Wir speichern das Spiel bereits auf einem Timer. Dies soll verhindern, dass Spieler die letzten Sekunden der Aktionen verlieren. Oft sind diese letzten Aktionen wichtig. – Fragsworth

+1

Sie sagen also, dass eine Person, die auf das X klickt, um ihr Browserfenster zu schließen, erwartet, dass alles, was sie in den letzten paar Sekunden getan haben, gespeichert werden soll? Ich denke, dass das Trainieren des Benutzers, auf einen Speicherknopf zu klicken und dann den Browser zu schließen, die Zeit besser ausgegeben wird.Wir müssen Benutzer aus der Mentalität von "Ich zog das Stromkabel von der Wand, warum nicht alles außer ???? !!!" – dstarh

Antwort

6

Die kurze Antwort ist, dass Sie nicht können.

Das Ereignis onbeforeunload wurde ursprünglich von Microsoft eingeführt, um einen Standardbestätigungsdialog zu ermöglichen. Es wird jetzt in der ursprünglichen Form von den meisten Browsern unterstützt und in den meisten Fällen kann eine kurze, nicht interaktive Funktion ausgeführt werden (zum Beispiel können Sie Ihren Status in localStorage protokollieren). Aber, wie in the cross-browser jQuery API beschrieben, ist dies unzuverlässig:

Die genaue Handhabung des Entlastungsereignisses von Version zu Version von Browsern unterschiedlich. Zum Beispiel lösen einige Versionen von Firefox das Ereignis aus, wenn eine Verknüpfung verfolgt wird, aber nicht, wenn das Fenster geschlossen wird. In der praktischen Anwendung sollte das Verhalten auf allen unterstützten Browsern getestet werden, , und dem proprietären beforeunload-Ereignis gegenübergestellt werden.

Da es viele möglichen Sicherheitsprobleme im Zusammenhang mit der Ausführung einer Aufgabe sind, wenn der Benutzer die Seite zu beenden gefragt (und damit das Skript), wird dies wahrscheinlich unzuverlässig sein, bis (und ob) eine ernsthafte Normalisierung Anstrengung um genau zu machen, was genau in einem onbeforeunload Callback getan werden kann.

Für die vorhersehbare Zukunft wird empfohlen, nicht auf onbeforeunload angewiesen zu sein, sondern andere Schemata zu verwenden, z. B. konstante Hintergrundspeicherung oder eine große "Speichern" -Schaltfläche.

1

Versuchen Sie window.onbeforeunload. Ich fand diese in der jQueryBug Tracker als eine mögliche Lösung:

window.onbeforeunload = function() { return "text"; } 
Verwandte Themen