Update (01.11.2016)
Ich habe AmplifyJS verwendet, um dieses Problem zu umgehen. Bei Safari in Private Browsing wurde jedoch auf einen speicherbasierten Speicher zurückgegriffen. In meinem Fall war dies nicht angemessen, da der Speicher beim Aktualisieren gelöscht wird, auch wenn sich der Benutzer noch im privaten Browser befindet.
Außerdem habe ich eine Reihe von Benutzern bemerkt, die unter iOS Safari immer im privaten Modus surfen. Aus diesem Grund ist es für Safari ein besserer Fallback, Cookies zu verwenden (falls verfügbar). Standardmäßig sind Cookies auch beim privaten Surfen weiterhin verfügbar. Natürlich werden sie beim Verlassen des privaten Browsings gelöscht, aber beim Aktualisieren werden sie nicht gelöscht.
Ich habe die lokale Speicher-Fallback- Bibliothek gefunden. Aus der Dokumentation:
Zweck
Bei Browsereinstellungen wie "Private Browsing" ist es selbst in neueren Browsern zu einem Problem geworden, sich auf ein funktionierendes window.localStorage zu verlassen. Auch wenn es möglicherweise vorhanden ist, werden beim Versuch, setItem oder getItem zu verwenden, Ausnahmen ausgelöst. Dieses Modul führt entsprechende Überprüfungen durch, um festzustellen, welcher Browserspeichermechanismus möglicherweise verfügbar ist, und macht ihn dann verfügbar. Es verwendet dieselbe API wie localStorage, daher sollte es in den meisten Fällen als Drop-In-Ersatz fungieren.
Vorsicht vor den Fallstricken:
- CookieStorage hat Speicherbeschränkungen. Sei hier vorsichtig.
- MemoryStorage bleibt zwischen dem Laden der Seite nicht bestehen. Dies ist mehr oder weniger eine Lücke, um Seitenabstürze zu verhindern, kann jedoch für Websites ausreichen, die keine vollständigen Seitenladevorgänge ausführen.
TL; DR:
Verwenden Sie Local-Storage-Fallback (einheitliche API mit .getItem(prop)
und .setItem(prop, val)
):
Überprüfen und verwenden Sie den entsprechenden Speicheradapter für den Browser (localStorage, sessionStorage, Cookies, Speicher).
Ursprüngliche Antwort
Eine mögliche Problemumgehung besteht darin, die Speichermethode zu ändern, um frühere Antworten zu ergänzen. Es gibt einige Bibliotheken wie AmplifyJS und PersistJS, die helfen können. Beide Bibliotheken ermöglichen dauerhaften clientseitigen Speicher über mehrere Backends.
Für AmplifyJS
lokaler Speicher
- IE 8+
- Firefox 3.5+
- Safari 4+
- Chrom
- Opera 10.5+
- iPhone 2+
- Android 2+
sessionStorage
- IE 8+
- Firefox 2+
- Safari 4+
- Chrom
- Opera 10.5+
- iPhone 2+
- Android 2+
globalStorage
Benutzerdaten
- IE 5 - 7
- userData existiert auch in neueren Versionen von IE, aber aufgrund von Macken in der Implementierung von IE 9 registrieren wir userData nicht, wenn localStorage unterstützt wird.
Erinnerung
- Ein speicherinterner Speicher wird als Fallback bereitgestellt, wenn keiner der anderen Speichertypen verfügbar ist.
Für PersistentJS
- Flash: Dauerhafter Flash 8-Speicher.
- Zahnräder: Google Gears-basierter persistenter Speicher.
- localstorage: HTML5-Entwurfsspeicher.
- globalstorage: HTML5-Entwurfsspeicher (alte Spezifikation).
- dh: Verhalten der Internet Explorer-Benutzerdaten.
- Cookie: Cookie-basierter persistenter Speicher.
Sie bieten eine Abstraktionsschicht, sodass Sie sich keine Gedanken über die Auswahl des Speichertyps machen müssen. Beachten Sie jedoch, dass es je nach Speichertyp einige Einschränkungen (z. B. Größenbeschränkungen) geben kann. Im Moment verwende ich AmplifyJS, aber ich muss noch einige Tests unter iOS 7 / Safari / etc. Durchführen. um zu sehen, ob es das Problem tatsächlich löst.