Ich versuche, einige Anforderungen an die Datenbank zu senden, wenn das Fenster entladen wird (d. h. wenn Sie die Seite aktualisieren). Aus irgendeinem Grund wird nur auf Safari der clientseitige Code ausgeführt, aber die Anforderung an den Server wird nie ausgeführt. Wenn ich den Code im Debugger manuell durchführe, erhält der Server die Anforderung und verarbeitet sie ordnungsgemäß.
Wer weiß, warum das passiert?
Wahrscheinlich ist die Anforderung, die im Abrufaufruf auftritt, asynchron und Safari wartet nicht darauf, dass es beendet wird, bevor es zur nächsten Seite weitergeht / die Registerkarte schließt. Wenn Sie den Anruf synchron ausführen können, sollte es funktionieren. Denken Sie daran, dass synchrone Aufrufe in einigen Tools generell nicht empfohlen und veraltet sind.
Diese Antwort zu Jquery hat eine gute Erklärung für synchrone Aufrufe: Ссылка
Sie können Benutzeragenten ignorieren normalerweise asynchrone Mit der Methode Beacon API
(FF, Chrome, Opera): XMLHttpRequests
in einem Entlade-Handler. Um dieses Problem zu lösen, erstellt der Analyse- und Diagnosecode typischerweise eine synchrone XMLHttpRequest
in einem unload
oder beforeunload
-Handler, um die Daten zu senden. Das synchrone XMLHttpRequest
zwingt den Benutzeragenten, das Entladen des Dokuments zu verzögern, und die nächste Navigation scheint langsamer zu sein. Es gibt nichts, was die nächste Seite tun kann, um diese Wahrnehmung schlechter Seitenlastleistung zu vermeiden. sendBeacon()
werden die Daten asynchron zum Webserver übertragen, wenn der User Agent dazu Gelegenheit hatte, ohne das Entladen zu verzögern oder die Leistung der nächsten Navigation zu beeinträchtigen.
Sie können dies mit jQuery.ajax tun, indem Sie die async-Eigenschaft auf false async:false
Wie @ Craigts sagte, ist der Browser verschwunden, bevor der Ajax-Aufruf zurückgegeben werden kann. Sie könnten ein paar Sekunden auf dieser Seite bekommen.
%Vor%Allerdings werden Ihre Benutzer das lästig finden.
Zweite Option, finde ein anderes Ereignis, anstatt auf das Entladen der Seite zu warten. Erfassen Sie Ihre Daten fortlaufend. Capture es onChange. Wird der Benutzer einen Link verwenden, um fortzufahren? Wenn dies der Fall ist, können Sie die Verknüpfung mit cancelEvent () übernehmen und dann fortsetzen, nachdem der Ajax zurückgegeben wurde.
Tags und Links javascript client safari server onbeforeunload