微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – localStorage setItem在ipad上不起作用

在我的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,可以像这样安装storage-available

npm install --save storage-available

那么你可以在你的代码中使用它,如下所示:

if (require('storage-available')('localStorage')) {
    // Yay!
}
else {
    // Awwww.....
}

2.回到垫片

一旦我们检测到问题,处理问题的最简单方法是回退到其他一些不会在每次写入时都抛出错误的对象.

memorystorage是我在Web Storage API之后编写的一个小库,但只是将所有内容存储在内存中.因为它使用相同的API,所以您可以将它用作localStorage的替代品,并且一切都将正常运行(尽管没有数据可以在页面重新加载后继续存在).它是开源的,所以请随意使用.

背景信息

有关MemoryStorage和此问题的更多信息,请阅读关于此主题的博文:Introducing MemoryStorage.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐