请检查Safari中是否启用了私密浏览。在Safari的私密浏览模式下,您的配额为零。因此,对
localStorage.setItem
的所有调用都将抛出超过配额的错误。个人认为这是Safari的巨大失误(因为许多网站会出现问题),但事实就是如此,所以我们必须找到一种解决方法。我们可以通过以下方式来实现:
- 检测我们是否拥有一个可用的localStorage
- 如果没有,回退到某些替代品。
如果您想了解详细信息,请继续阅读 :)
1:检测功能性本地存储
我目前正在使用此代码来检测本地存储是否可用,并在不可用时回退到shim:
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();}
DB = localStorage;
}
catch(e) {
DB = new MemoryStorage('my-app');
}
编辑:编写此文后,我已经将该特征检测代码打包。如果您正在使用NPM,可以按以下方式安装storage-available:
npm install --save storage-available
然后,您可以在代码中像这样使用它:
if (require('storage-available')('localStorage')) {
}
else {
}
2. 回退到一个备用对象
一旦我们检测到问题,最简单的处理方法是回退到另一个不会在每次写入时抛出错误的对象。
memorystorage 是我编写的一个小型库,遵循 Web Storage API,但将所有内容都存储在内存中。由于它使用相同的API,您可以将其用作localStorage的替代品,并且一切都可以正常运作(尽管没有数据可以在页面重新加载后保存)。它是开源的,因此可随意使用。
背景信息
有关MemoryStorage和此问题的更多信息,请阅读我关于此主题的博客文章:介绍MemoryStorage。
localStorage.setItem("proDB","foo");
能够工作吗?你是否超过配额? - epascarellovar temp = JSON.stringify(data); console.log(temp);
我会得到字符串显示。所以看起来是 localStorage 函数有问题。我只在 localStorage 中写了一些东西,所以我认为我真的没有达到配额。 - Louis