- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在我的混合应用程序 (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 的一个巨大错误(因为很多网站都崩溃了),但事实就是如此,所以我们必须找到解决它的方法。我们可以通过以下方式做到这一点:
如果您需要详细信息,请继续阅读 :)
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 .
关于javascript - localStorage setItem 不适用于 ipad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22543391/
我是一名优秀的程序员,十分优秀!