在我的hydbrid应用程序(Phonegap)中,我试图以非常标准的方式写入localStorage:
window.localStorage.setItem("proDB", JSON.stringify(data));
要么
window.localStorage["proDB"] = JSON.stringify(data);
但它在iPad 2(iOS 7.1)上的Safari上不起作用.
它不起作用,整个应用程序停止.
这是这个ipad的userAgent:
你能帮助我吗 ?
谢谢
请检查您是否在Safari中启用了私人浏览功能.在Safari私密浏览模式下,您获得的配额为零.因此,所有调用localStorage.setItem
将超出配额的错误.我个人认为这是Safari的一个巨大错误(因为许多网站都破了),但它就是这样,所以我们必须找到解决方法.我们可以这样做:
检测我们是否具有功能localStorage
如果没有,可以回到一些替代品.
如果你想要详细信息请继续阅读:)
1:检测功能本地存储
我目前正在使用此代码来检测本地存储是否可用,如果不是,则回退到垫片:
var DB; try { var x = '_localstorage_test_' + Date.now(); localStorage.setItem(x, x); var y = localStorage.getItem(x); localStorage.removeItem(x); if (x !== y) {throw new Error();} // check we get back what we stored DB = localStorage; // all fine } catch(e) { // no localstorage available, use shim DB = new MemoryStorage('my-app'); }
编辑:自写这篇文章以来,我已经打包了功能检测代码.如果您使用NPM,您可以安装存储 -如下所示:
npm install --save storage-available
那么你可以在你的代码中使用它,如下所示:
if (require('storage-available')('localStorage')) { // Yay! } else { // Awwww..... }
2.回到垫片
一旦我们检测到问题,处理问题的最简单方法是回退到其他一些不会在每次写入时抛出错误的对象.
memorystorage是我编写的一个小库,它遵循 Web Storage API,但只是将所有内容存储在内存中.因为它使用相同的API,所以您可以将它用作localStorage的替代品,并且一切都将正常运行(尽管没有数据可以在页面重新加载后继续存在).它是开源的,所以请随意使用.
背景信息
有关MemoryStorage和此问题的更多信息,请阅读我关于此主题的博客文章:MemoryStorage简介.