Safari führt keine Callback-Funktion beim Aktualisieren / onbeforeunload auf der Serverseite aus (ruft clientseitigen Code auf)

8

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?

%Vor%
    
petranaya 11.12.2015, 20:36
quelle

4 Antworten

5

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: Ссылка

    
craigts 16.12.2015, 16:27
quelle
2

Sie können Beacon API (FF, Chrome, Opera): %Vor%

Benutzeragenten ignorieren normalerweise asynchrone 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.

Mit der Methode 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.

    
Pinal 16.12.2015 21:48
quelle
0

Sie können dies mit jQuery.ajax tun, indem Sie die async-Eigenschaft auf false async:false

setzen %Vor%     
Pedram 20.12.2015 13:30
quelle
0

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.

    
Rob Y 20.12.2015 15:28
quelle