Fenster.onbeforeunload ajax-request in Chrom
Ich habe eine web-Seite, die Griffe, remote-Steuerung einer Maschine durch Ajax. Wenn der Benutzer navigiert Weg von der Seite, ich würde gerne automatisch trennen Sie es von der Maschine. So hier ist der code:
window.onbeforeunload = function () {
bas_disconnect_only();
}
Dem abschalten der Funktion senden Sie einfach eine HTTP-GET-request auf eine PHP-server-Seite Skript, das macht die eigentliche Arbeit zu trennen:
function bas_disconnect_only () {
var xhr = bas_send_request("req=10", function () {
});
}
Dies funktioniert gut in FireFox. Aber mit Chrome, der ajax-request nicht gesendet wird, an alle. Es ist inakzeptabel Problemumgehung: Hinzufügung Warnung an die callback-Funktion:
function bas_disconnect_only () {
var xhr = bas_send_request("req=10", function () {
alert("You're been automatically disconnected.");
});
}
Nach dem hinzufügen der alert-Aufruf, der Antrag wäre erfolgreich gesendet. Aber wie Sie sehen können, es ist nicht wirklich eine Arbeit um überhaupt.
Könnte jemand mir sagen, ob das machbar ist mit Chrome? Was ich mache, sieht das völlig legitim für mich.
Dank,
Spitzen: bas_send_request() ist ein einfacher wrapper, erstellen Sie eine ajax-Anfrage aus und senden Sie es. Ich glaube nicht, dass es notwendig zu zeigen, dass die Art von detail.
InformationsquelleAutor lang2 | 2011-02-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche problem, wo Chrome war nicht das senden der AJAX-Anfrage an den server im Fenster.unload-Ereignis.
Ich war nur in der Lage, um es zu arbeiten, wenn die Anfrage synchron. Ich war in der Lage, dies zu tun mit Jquery und Einstellung der async Eigenschaft false:
Der obige code funktioniert bei mir im IE9, Chrome 19.0.1084.52 m, und Firefox 12.
Bitte beachten Sie, dass die synchrone ajax-Aufrufe nicht empfohlen. Wenn ich mich Recht erinnere, moderne Browser zeigen eine Warnung in der Konsole, wenn dabei die sync-ajax.
Die Lösung hat nicht funktioniert. Es funktioniert nur jeder einmal in eine Weile.
InformationsquelleAutor Garry English
Dies ist relevant für die neueren Versionen von Chrome.
Wie @Garry Englisch sagte, senden Sie eine
async
Anfrage während Seiteonunload
wird nicht funktionieren, da der browser die töten, den thread vor dem Absenden der Anfrage. Senden Sie einesync
Anfrage sollte aber funktionieren.Diese war rechts, bis version 29 von Chrome, aber Chrome V 30 es plötzlich aufgehört zu arbeiten wie hier angegeben.
Es scheint, dass der einzige Weg, dies zu tun, ist heute mithilfe der
onbeforeunload
Veranstaltung wie hier vorgeschlagen.ABER Achtung: andere Browser werden nicht zulassen, Sie senden von Ajax-Anfragen in das onbeforeunload-Ereignis überhaupt. also, was Sie tun müssen ist, führen Sie die Maßnahmen in beiden entladen und beforeunload, und überprüfen Sie, ob es bereits stattgefunden hatte.
Etwas wie dieses:
wenn Sie mehr details, vielleicht könnten wir versuchen und helfen. Was genau scheitert? heißt es-ata? sind Sie sicher, dass Ihre Anfrage ist synchron?
es auf der offiziellen Dune Website funktioniert nicht mehr. Ich vermute, dass eine neue Version von chrome, die ein problem aber ich kann nicht sagen, für sicher, bis ich weiß, einige weitere tests. Ich bin mit einem Rahmen, es ist eine boolean zu setzen, der ajax-Aufruf zu synchronisieren und es funktioniert sehr gut, alle über die software, außer in der onbeforeunload-Ereignis des Fensters. (Netzwerk-Fehler ausgelöst)
es gibt ein Beispiel in der Antwort selbst, mit onunload und onbeforeunload. Sie können auch sehen, dieser Seite für weitere Erläuterungen und Beispiele. Wenn ich bin fehlt etwas in dir Frage, bitte fühlen Sie sich frei, zu erarbeiten, so kann ich sagen, genau das problem.
Toll. Sie konnte nur schreiben ... .auf('unload beforeunload', ... und pack die Funktion direkt dort können Sie nicht?
InformationsquelleAutor Mohoch
Kasse die Navigator.sendBeacon() Methode wurde für diesen Zweck gebaut.
Den MDN-Seite sagt:
Dies ist ein relativ neuer API und scheint nicht unterstützt zu werden vom IE noch nicht.
InformationsquelleAutor Sparky
Versuchen Sie, erstellen eine variable (Boolean vorzugsweise) und es zu ändern, sobald Sie eine Antwort bekommen von der Ajax-Aufruf. Und setzen Sie die
bas_disconnect_only()
Funktion innerhalb einer while-Schleife.Ich hatte auch ein problem wie dieses mal. Ich denke, das passiert, weil Chrom nicht warten, für den Ajax-call. Ich weiß nicht, wie ich es behoben und ich habe nicht versucht diesen code aus, also ich weiß nicht, ob es funktioniert. Hier ist ein Beispiel:
Innen die
bas_send_request()
Funktion (xmlhttp wird die HTTP-Anfrage):Glück und ich hoffe, das hilft.
InformationsquelleAutor Metod Medja
Hatte ich auf jede Fälle, wenn die Benutzer verlassen die Seite und schicken ajax-request backend.
Bewusst sein, dass die Veranstaltung "pagehide" Feuer im desktop-browser, aber es hat nicht ausgelöst, wenn Benutzer klicken Sie auf die zurück/vorwärts-Schaltflächen im browser (test in der aktuellen version von Mozilla Firefox).
InformationsquelleAutor sNICkerssss
Ich habe die Suche nach einer Art, in der das verlassen der Seite wird erkannt und mit AJAX Anfrage. Es funktionierte, wie jedes mal, wenn ich es verwenden, und überprüfen Sie es mit MySQL. Dies ist der code (funktioniert in Google Chrome):
InformationsquelleAutor Xabier Aparicio Muñoa