Обновление (2016-11-01)
Я использовал AmplifyJS, упомянутый ниже, чтобы обойти эту проблему. Тем не менее, для Safari в режиме приватного просмотра он возвращался к памяти на основе памяти. В моем случае это было неуместно, потому что это означает, что хранилище очищается при обновлении, даже если пользователь все еще находится в режиме частного просмотра.
Кроме того, я заметил ряд пользователей, которые всегда смотрят в приватном режиме на iOS Safari. По этой причине лучшим вариантом для Safari является использование файлов cookie (если они доступны). По умолчанию файлы cookie по-прежнему доступны даже при приватном просмотре. Конечно, они очищаются при выходе из частного просмотра, но они не очищаются при обновлении.
Я нашел библиотеку local-storage-fallback . Из документации:
Цель
С настройками браузера, такими как «Приватный просмотр», стало проблемой полагаться на работающий window.localStorage, даже в новых браузерах. Несмотря на то, что он может существовать, он будет выдавать исключения при попытке использовать setItem или getItem. Этот модуль будет запускать соответствующие проверки, чтобы увидеть, какой механизм хранения браузера может быть доступен, а затем выставить его. Он использует тот же API, что и localStorage, поэтому в большинстве случаев он должен работать в качестве замены.
Остерегайтесь ошибок:
- CookieStorage имеет ограничения по хранению. Будьте осторожны здесь.
- MemoryStorage не будет сохраняться между загрузками страниц. Это более или менее временный интервал для предотвращения сбоев страниц, но может быть достаточно для веб-сайтов, которые не выполняют полную загрузку страниц.
TL; DR:
Используйте local-storage-fallback (унифицированный API с .getItem(prop)
и .setItem(prop, val)
):
Проверьте и используйте соответствующий адаптер хранилища для браузера (localStorage, sessionStorage, cookie, память)
Оригинальный ответ
Чтобы добавить к предыдущим ответам, одним из возможных обходных путей может быть изменение метода хранения. Есть несколько библиотек, таких как AmplifyJS и PersistJS, которые могут помочь. Обе библиотеки обеспечивают постоянное хранение на стороне клиента через несколько бэкэндов.
Для AmplifyJS
LocalStorage
- IE 8+
- Firefox 3.5+
- Safari 4+
- Хром
- Опера 10.5+
- iPhone 2+
- Android 2+
sessionStorage
- IE 8+
- Firefox 2+
- Safari 4+
- Хром
- Опера 10.5+
- iPhone 2+
- Android 2+
globalStorage
данные пользователя
- IE 5 - 7
- userData существует и в более новых версиях IE, но из-за особенностей реализации IE 9 мы не регистрируем userData, если поддерживается localStorage.
объем памяти
- Хранилище в памяти предоставляется в качестве запасного варианта, если ни один из других типов хранения не доступен.
Для постоянных JS
- Вспышка: Flash 8 постоянного хранения.
- gears: постоянное хранилище на основе Google Gears.
- localstorage: хранилище черновиков HTML5.
- globalstorage: хранилище черновиков HTML5 (старая спецификация).
- то есть: поведение пользовательских данных Internet Explorer.
- cookie: постоянное хранилище на основе cookie.
Они предлагают уровень абстракции, поэтому вам не нужно беспокоиться о выборе типа хранилища. Имейте в виду, что могут быть некоторые ограничения (например, ограничения размера) в зависимости от типа хранилища. Прямо сейчас я использую AmplifyJS, но мне все еще нужно провести еще какое-то тестирование на iOS 7 / Safari / и т.д. чтобы увидеть, действительно ли это решает проблему.