Aktualizacja (01.11.2016)
Użyłem wspomnianego poniżej AmplifyJS do obejścia tego problemu. Jednak w przypadku przeglądarki Safari w trybie prywatnym wracała do pamięci opartej na pamięci. W moim przypadku nie było to właściwe, ponieważ oznacza to, że pamięć jest czyszczona podczas odświeżania, nawet jeśli użytkownik nadal korzysta z prywatnego przeglądania.
Zauważyłem również wielu użytkowników, którzy zawsze przeglądają w trybie prywatnym na iOS Safari. Z tego powodu lepszym rozwiązaniem dla Safari jest użycie plików cookie (jeśli są dostępne). Domyślnie pliki cookie są nadal dostępne nawet podczas prywatnego przeglądania. Oczywiście są one usuwane podczas wychodzenia z prywatnego przeglądania, ale nie są usuwane podczas odświeżania.
Znalazłem bibliotekę rezerwową lokalnego magazynu . Z dokumentacji:
Cel, powód
Przy ustawieniach przeglądarki, takich jak „Prywatne przeglądanie”, problemem stało się poleganie na działającym window.localStorage, nawet w nowszych przeglądarkach. Mimo że może istnieć, zgłasza wyjątki podczas próby użycia setItem lub getItem. Ten moduł uruchomi odpowiednie kontrole, aby sprawdzić, jaki mechanizm pamięci przeglądarki może być dostępny, a następnie go ujawni. Używa tego samego interfejsu API co localStorage, więc w większości przypadków powinien działać jako zastępczy drop-in.
Uwaga na gotchas:
- CookieStorage ma limity przechowywania. Uważaj tutaj.
- MemoryStorage nie będzie trwał między ładowaniami stron. Jest to mniej więcej przerwa, aby zapobiec awariom strony, ale może być wystarczająca w przypadku witryn, które nie ładują całej strony.
TL; DR:
Użyj rezerwy lokalnej pamięci masowej (ujednolicony interfejs API z .getItem(prop)
i .setItem(prop, val)
):
Sprawdź i użyj odpowiedniego adaptera pamięci dla przeglądarki (localStorage, sessionStorage, cookies, pamięć)
Oryginalna odpowiedź
Aby dodać poprzednie odpowiedzi, jednym z możliwych obejść może być zmiana metody przechowywania. Istnieje kilka librairies, takich jak AmplifyJS i PersistJS które mogą pomóc. Obie biblioteki pozwalają na trwałe przechowywanie po stronie klienta przez kilka backendów.
Dla AmplifyJS
Lokalny magazyn
- 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
dane użytkownika
- IE 5 - 7
- userData istnieje również w nowszych wersjach IE, ale z powodu dziwactw w implementacji IE 9, nie rejestrujemy userData, jeśli jest obsługiwany localStorage.
pamięć
- Magazyn w pamięci jest zastępczy, jeśli żaden z pozostałych typów pamięci nie jest dostępny.
For PersistentJS
- flash: Pamięć trwała Flash 8.
- koła zębate: trwałe miejsce do przechowywania oparte na Google Gears.
- localstorage: Przechowywanie wersji roboczej HTML5.
- globalstorage: Przechowywanie wersji roboczej HTML5 (stara specyfikacja).
- tj. zachowania danych użytkownika w Internet Explorerze.
- cookie: trwałe przechowywanie na podstawie plików cookie.
Oferują warstwę abstrakcji, więc nie musisz się martwić o wybór rodzaju pamięci. Pamiętaj jednak, że mogą istnieć pewne ograniczenia (takie jak limity wielkości) w zależności od rodzaju pamięci. W tej chwili używam AmplifyJS, ale nadal muszę wykonać więcej testów na iOS 7 / Safari / etc. aby sprawdzić, czy to faktycznie rozwiązuje problem.