Quick Tipp: Wenn der Browser nicht mehr aus dem BFCache lädt
Jeder Browser besitzt einen sogenannten BFCache, das steht für Back and Forward Cache und ist für den Zurück- und Vorwärts-Button im Browser zuständig. Jeder Browser hat seine eigene Logik, welche Bedingungen erfüllt sein müssen, damit der BFCache funktioniert. Wir gehen in diesem Quick Tipp speziell auf den Firefox Browser ein.
Ist Zustand
Für unseren Kunden haben wir mittels JavaScript und Ajax dynamische Tabellen generiert, über die flexibel innerhalb der Tabelle gefiltert werden kann. Diese Filterung wird für jede Tabelle gespeichert und automatisch wieder gesetzt, sobald der Benutzer zu dieser Tabelle zurückkehrt.
Anforderung
Nun war der Wunsch des Kunden, dass die Filterung gelöscht wird, sobald man über die Seiten-Navigation wieder zurück in den Dialog kommt. Damit aber die Filterung nicht gänzlich verloren ist, soll sichergestellt werden, dass über den Browser Zurück-Button die Seite aus dem Cache geladen wird.
Problemstellung
Während der Entwicklung ist uns aufgefallen, dass im Browser Firefox der Zurück-Button die Informationen nicht aus dem Cache holt, sondern einen Request an den Server sendet und somit den Inhalt neu generiert. Beim Testen in Chrome hingegen funktioniert der Zurück-Button wie gewünscht und holt den Inhalt aus dem Cache.
Lösungsweg für den Firefox BFCache
Unter folgenden Bedingungen greift der BFCache nicht mehr:
-
Wenn im JavaScript das Event unload oder beforeunload verwendet wird
-
Wenn speziell im HTTP Header das Attribut cache-control: no-store oder cache-control: no-cache übermittelt wird
-
Die Seite muss beim Aufruf komplett geladen werden, damit diese vom BFCache gespeichert wird
-
Wenn auf der Seite ein Frame eingebunden ist, wird nur das erste geladene Frame gespeichert. Wenn der Inhalt des Frames geändert wird, wird dieses nicht im BFCache abgespeichert, da es sich hierbei um keine neue Seite handelt.
In unserem konkreten Fall wurde die beforeunload Funktion verwendet, um festzustellen, ob der Benutzer die Seite verlassen hat, bevor diese vollständig geladen wurde. Diese haben wir mit dem der Funktion pagehide ausgetauscht, welches ein ähnliches Verhalten aufweist wie die beforeunload.
Das bedeutet, wenn der BFCache nicht beeinträchtigt werden soll, muss bei der Entwicklung unbedingt auf diese Bedingungen geachtet werden.