我尝试将HTML5(localStorage)中提供的客户端存储用于Iphone应用程序,我完全了解localStorage的“ QUOTA ”(目前 5MB < /强>)。
现在问题出在我的应用程序上(之前没有存储数据)。尝试将数据存储在localStorage中导致 QUOTA_EXCEEDED_ERR 虽然整体数据的大小小于5 MB(精确到~4.5b(在普通浏览器中使用chrome web inspector找到))
任何人都可以分享一下这个数据如何权衡4Kb导致 QUOTA_EXCEEDED_ERR 当相同 5MB的上限
时请注意,问题仅针对iPhone ,所有浏览器,甚至 iPhone模拟器也未提示QUOTA_EXCEEDED_ERR错误< / p> iPhone目前的图片是iPhone 4。
答案 0 :(得分:28)
进入设置 - &gt; Safari并检查隐私浏览是否已启用。如果是,本地存储将无法存储任何内容。以下是为您检查本地存储的一些基本代码:
if (!!window.localStorage)
{
localStorage.setItem(key, val);
};
另外,你是如何设置它的?您使用localStorage.setItem(key, val)
还是尝试localStorage(key, val)
?您的问题可能来自设置不正确
答案 1 :(得分:19)
我遇到了同样的问题,而JoeCortopassi只是部分正确:它是由私人浏览启用引起的。该答案中提供的代码虽然没有多大帮助。当我在iPad Safari(ios5)上测试时,我得到了
console.log(!!window.localStorage); // true
一旦我尝试设置一个值,我就会得到一个例外:
localStorage.setItem("test", "test") // Exception 22 is thrown
因此,要准确测试本地存储支持,必须尝试在本地存储中设置一个值,例如:
var localStorageSupported = function() {
try {
localStorage.setItem("test", "test");
localStorage.removeItem("test");
return true;
} catch(e){
return false;
}
}
答案 2 :(得分:8)
事实是在Safari for iOS上使用隐私浏览模式&lt; 6不会清空window.localStorage
和window.sessionStorage
,因此检查!!window.localStorage
或!!window.sessionStorage
是不够的,无论你从这些组件调用什么都会失败,抛出这个 QUOTA_EXCEEDED_ERR 错误。
在这些平台上,私有模式似乎将配额设置为零。这就是为什么要真正测试这些功能,就像Modernizr一样,你必须将它包装在try ... catch语句中。
Modernizr代码:
var mod = 'modernizr';
/*...*/
tests['localstorage'] = function() {
try {
localStorage.setItem(mod, mod);
localStorage.removeItem(mod);
return true;
} catch(e) {
return false;
}
};
我们必须信任Web API,但要非常小心。
答案 3 :(得分:3)
尝试在设置新值之前删除该值:
localStorage.removeItem(key);
localStorage.setItem(key, val);
另见this question,因为它看起来很相似。
答案 4 :(得分:3)
本地存储配额与域绑定,如果您有其他页面使用数据存储,则可能会将其填满。当你得到异常时,迭代密钥以找出存储器中的什么。
try {
// try to insert storage here
} catch ( err ) {
for ( var i =0; i < storage.length ; i++ ) {
console.log ( storage.key( i ) )
}
}