更新(2016-11-01)
我使用下面提到的AmplifyJS来解决这个问题。然而,对于Safari Private浏览器来说,它正在退回到基于内存的存储。在我的例子中,这并不合适,因为这意味着刷新时存储将被清除,即使用户仍处于私有浏览状态。
另外,我注意到很多用户在iOS Safari上总是以私密模式浏览。出于这个原因,Safari更好的备选方案是使用cookie(如果可用的话)。默认情况下,即使在私人浏览中,cookie仍然可以访问。当然,它们在退出私人浏览时被清除,但在刷新时不会被清除。
我找到了local-storage-fallback库。从文档中可以看到:
目的
对于像“私人浏览”这样的浏览器设置,依赖工作窗口已经成为一个问题。localStorage,即使在较新的浏览器中也是如此。即使它可能存在,它也会在尝试使用setItem或getItem时抛出异常。这个模块将运行适当的检查,以查看可用的浏览器存储机制,然后公开它。它使用与localStorage相同的API,因此在大多数情况下它应该可以作为一个临时替代品。
小心陷阱:
CookieStorage有存储限制。这里要小心。
MemoryStorage将不会在页面加载之间持续存在。这或多或少是一种防止页面崩溃的权宜之计,但对于不进行完整页面加载的网站来说可能已经足够了。
TL; diana:
使用本地存储回退(具有.getItem(prop)和.setItem(prop, val)的统一API):
检查并使用适当的浏览器存储适配器(localStorage、sessionStorage、cookie、内存)
原来的答案
为了补充前面的答案,一种可能的解决方法是改变存储方法。有一些库,如AmplifyJS和PersistJS可以提供帮助。这两个库都允许通过几个后端进行持久的客户端存储。
对于AmplifyJS
localStorage
IE 8 +
Firefox 3.5 +
Safari 4 +
铬
Opera 10.5 +
iPhone 2 +
安卓2 +
sessionStorage
IE 8 +
Firefox 2 +
Safari 4 +
铬
Opera 10.5 +
iPhone 2 +
安卓2 +
globalStorage
Firefox 2 +
用户数据
Ie 5 - 7
userData也存在于新版本的IE中,但是由于ie9实现中的一些奇怪之处,我们不会在localStorage中注册userData
是支持的。
内存
如果没有其他存储类型可用,则提供内存中存储作为后备。
对于持久化
flash: flash 8持久化存储。
gears:谷歌基于gears的持久存储。
localstorage: HTML5草案存储。
globalstorage: HTML5草案存储(旧规范)。
ie: Internet Explorer用户数据行为。
cookie:基于cookie的持久化存储。
它们提供了一个抽象层,因此您不必担心选择存储类型。请记住,根据存储类型可能会有一些限制(例如大小限制)。现在,我正在使用AmplifyJS,但我仍然需要在iOS 7/Safari/等上做更多的测试。看看它是否真的能解决问题。