Diese Frage ähnelt dem Verfolgen, wenn der Benutzer im Browser auf die Schaltfläche "Zurück" klickt , ist jedoch nicht dieselbe ... Ich habe eine Lösung und poste sie hier als Referenz und Feedback. Wenn jemand bessere Möglichkeiten hat, bin ich ganz Ohr!
Die Situation ist, dass ich eine Seite mit einem "In-Place-Edit" habe, a la flickr. Dh es gibt einen DIV "Klicken Sie hier, um eine Beschreibung hinzuzufügen", der sich beim Klicken in eine TEXTAREA mit den Schaltflächen Speichern und Abbrechen verwandelt. Wenn Sie auf Speichern klicken, werden die Daten an den Server gesendet, um die Datenbank zu aktualisieren, und die neue Beschreibung wird anstelle von TEXTAREA in die DIV eingefügt. Wenn die Seite aktualisiert wird, wird die neue Beschreibung aus der Datenbank mit der Option "Klicken zum Bearbeiten" angezeigt. Ziemlich normales Web 2.0-Zeug in diesen Tagen.
Das Problem ist, dass wenn:
- Die Seite wird ohne Beschreibung geladen
- Eine Beschreibung wird vom Benutzer hinzugefügt
- Die Seite wird durch Klicken auf einen Link entfernt
- Der Benutzer klickt auf die Schaltfläche Zurück
Anschließend wird (aus dem Cache des Browsers) die Version der Seite ohne den dynamisch geänderten DIV angezeigt, der die neue Beschreibung enthält.
Dies ist ein ziemlich großes Problem, da der Benutzer davon ausgeht, dass sein Update verloren gegangen ist und nicht unbedingt versteht, dass er die Seite aktualisieren muss, um die Änderungen zu sehen.
Die Frage lautet also: Wie können Sie eine Seite nach dem Laden als geändert markieren und dann erkennen, wann der Benutzer "dorthin zurückkehrt" und in dieser Situation eine Aktualisierung erzwingen?
quelle
Antworten:
Verwenden Sie ein verstecktes Formular. Formulardaten bleiben (normalerweise) in Browsern erhalten, wenn Sie neu laden oder auf die Schaltfläche "Zurück" klicken, um zu einer Seite zurückzukehren. Folgendes wird auf Ihrer Seite angezeigt (wahrscheinlich ganz unten):
In Ihrem Javascript benötigen Sie Folgendes:
Das js, das das Formular abruft, muss ausgeführt werden, nachdem das HTML vollständig analysiert wurde. Sie können jedoch sowohl das Formular als auch das js oben auf der Seite inline setzen (js Sekunde), wenn die Benutzerlatenz ein ernstes Problem darstellt.
quelle
Hier ist eine sehr einfache moderne Lösung für dieses alte Problem.
window.performance wird derzeit von allen gängigen Browsern unterstützt.
quelle
window.performance && window.performance.navigation.type
statt nurwindow.performance.navigation.TYPE_BACK_FORWARD
?).window.performance.navigation.TYPE_BACK_FORWARD
ist eine Konstante, die immer gleich 2 ist. Sie wird also nur zum Vergleich verwendet.performance.navigation
veraltet und es wird empfohlen, stattdessen developer.mozilla.org/en-US/docs/Web/API/… zu verwenden2
für Treffer auf der Zurück-Schaltfläche. Bis v70 wurde es falsch zurückgegeben1
.Dieser Artikel erklärt es. Siehe den folgenden Code: http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/
quelle
event.persisted
= zurückfalse
, auch wenn Sie auf die Schaltfläche "Zurück" klicken. Sie müssenwindow.performance.navigation
oder PerformanceNavigationTiming für Chrome verwenden.Für moderne Browser scheint dies jetzt der richtige Weg zu sein:
Dies ist ab Januar 2020 noch "experimentell", scheint aber gut unterstützt zu werden.
https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigationTiming
quelle
Wie oben erwähnt, hatte ich eine Lösung gefunden und poste sie hier als Referenz und Feedback.
Die erste Stufe der Lösung besteht darin, der Seite Folgendes hinzuzufügen:
Der Inhalt von
fresh.html
ist nicht wichtig, daher sollte Folgendes ausreichen:Wenn clientseitiger Code die Seite aktualisiert, muss die Änderung wie folgt gekennzeichnet werden:
stale.html
erledigt die ganze Arbeit: Wenn es geladen ist, ruft es diereload_stale_page
Funktion auf, die die Seite bei Bedarf aktualisiert. Das erste Mal, wenn es geladen wird (dh nachdem die Änderung vorgenommen wurde, wird diereload_stale_page
Funktion nichts tun.)Nach meinen (minimalen) Tests in dieser Phase scheint dies wie gewünscht zu funktionieren. Habe ich etwas übersehen?
quelle
Sie können es mit dem Ereignis onbeforeunload lösen :
Wenn Sie eine leere Event-Manager-Funktion vor dem Laden haben , wird die Seite bei jedem Zugriff neu erstellt. Javascripts werden erneut ausgeführt, serverseitige Skripte werden erneut ausgeführt, die Seite wird so erstellt, als ob der Benutzer sie zum ersten Mal aufgerufen hätte, selbst wenn der Benutzer die Seite nur durch Drücken der Zurück- oder Vorwärts-Schaltfläche aufgerufen hätte .
Hier ist der vollständige Code eines Beispiels:
Probieren Sie es aus, navigieren Sie auf dieser Seite weg und kehren Sie dann mit den Schaltflächen "Zurück" oder "Weiter" in Ihrem Browser zurück.
Es funktioniert gut in IE, FF und Chrome.
Natürlich können Sie in der Funktion myfun tun, was Sie wollen .
Weitere Informationen: http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript
quelle
Sie können localStorage oder sessionStorage ( http://www.w3schools.com/html/html5_webstorage.asp ) verwenden, um ein Flag zu setzen (anstatt ein verstecktes Formular zu verwenden).
quelle
Verwendung dieser Seite, insbesondere Einbeziehung des Kommentars von @sajith zur Antwort von @Nick White und dieser Seite: http://www.mrc-productivity.com/techblog/?p=1235
quelle
Hier ist eine jQuery-Version. Ich muss es einige Male verwenden, da Safari Desktop / Mobile den Cache handhabt, wenn ein Benutzer die Zurück-Taste drückt.
quelle
Ich bin heute auf ein ähnliches Problem gestoßen und habe es mit localStorage gelöst (hier mit ein bisschen jQuery):
Si im Grunde:
Wenn der Benutzer das Formular absendet, legen wir auf Seite 1 in localStorage den Wert "Schritte" fest, um anzugeben, welchen Schritt der Benutzer unternommen hat. Gleichzeitig starten wir eine Funktion mit Timeout, die prüft, ob dieser Wert geändert wurde (z. B. 10 Mal / Sekunde).
Auf Seite 2 ändern wir diesen Wert sofort.
Wenn der Benutzer die Schaltfläche "Zurück" verwendet und der Browser Seite 1 in dem Zustand wiederherstellt, in dem wir sie verlassen haben, wird die Funktion "checkSteps" weiterhin ausgeführt und kann feststellen, dass der Wert in "localStorage" geändert wurde (und entsprechende Maßnahmen ergreifen kann) ). Sobald diese Prüfung ihren Zweck erfüllt hat, müssen Sie sie nicht mehr ausführen, sodass wir setTimeout einfach nicht mehr verwenden.
quelle