3 Stimmen

Synchrones AJAX-Posting aus dem Unload-Ereignis: Wie kann sichergestellt werden, dass der Benutzer die aktuellsten Informationen aus der DB beim nächsten Laden der Seite sieht?

Wenn ein Benutzer einen Eintrag in unserem CMS bearbeiten möchte, sperren wir ihn, so dass niemand sonst ihn gleichzeitig bearbeiten kann. Wir geben die Sperre wieder frei, wenn der Benutzer seine Änderungen übermittelt. Wir müssen jedoch den Fall behandeln, dass der Benutzer die Seite über andere Links verlässt... mein erster Versuch ist, jQuery zu verwenden, um eine synchrone $.ajax() anrufen $(window).unload . Dies funktioniert zwar, aber auf der nächsten Seite, die der Benutzer sieht, scheint der Eintrag gesperrt zu sein (vorausgesetzt, er kehrt zu der Seite zurück, auf der alle Einträge aufgelistet sind, z. B. über die Schaltfläche "Zurück"). Ein einfaches Aktualisieren der Seite zeigt, dass der Eintrag wieder zur Bearbeitung bereit ist.

Meine Vermutung wäre, dass der Browser aus irgendeinem Grund die nächste Seite abruft, bevor die Ajax-Anfrage vollständig verarbeitet wurde. Die Frage ist, ob es einen Weg gibt, um sicherzustellen, dass die Dinge in der richtigen Reihenfolge geschehen.

var fire_unload_ajax = true; // certain things set this to false, not relevant
$(window).unload(function() {
    if(fire_unload_ajax && $("#reset-entry-lock form").length == 1) {
        $.ajax({
            url: window.location.href,
            async: false,
            cache: false,
            type: "POST",
            data: $("#reset-entry-lock form").serialize()
        });
    }
});

1 Stimmen

In diesem Fall bleibt das Problem bestehen, wenn Sie Opera verwenden, da dieser Browser keine on(before)unload-Ereignisse erzeugt.

2voto

Kramii Punkte 8269

Ich habe ein ähnliches Problem in einer Anwendung gelöst, die ich kürzlich geschrieben habe.

Ich endete mit Code im Load-Ereignis von jede Seite in meiner Anwendung, die prüft, ob der Benutzer noch Sperren hat, und diese freigibt, wenn sie nicht mehr benötigt werden. Ich hatte auch Code wie der Ihre, die Sperren auf ein Unload-Ereignis freigegeben, für den Fall, dass der Benutzer zu einer Seite außerhalb meiner App navigiert wurde.

Für Opera-Benutzer (usw.) hatte ich beabsichtigt, Sperren automatisch jede Minute oder so ablaufen zu lassen und ein asynchrones Postback von meiner App alle 30 Sekunden durchzuführen, um die Sperren zu erneuern. Auf diese Weise würden Benutzer, die anderswo navigiert haben ihre Sperren freigegeben, auch wenn das Entladen Ereignis nicht ausgelöst wurde. Leider wurde mein Projekt abgebrochen, bevor dies implementiert wurde.

0voto

Marcel Korpel Punkte 21267

Sie könnten den Status des Formulars mit einem asynchronen AJAX POST etwa alle fünf Minuten senden, so wie es Gmail beim Schreiben einer Nachricht macht. Wie ich in meinem Kommentar erklärt habe, können Sie sich nicht auf onbeforeunload .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X