Javascript QuoteExceedeError:Dom异常22:试图向存储中添加超出配额的内容
在iPhone和iOS 7上使用LocalStorage会引发此错误。我一直在寻找一个解决方案,但考虑到我甚至没有私下浏览,没有什么是相关的 我不明白为什么在iOS 7中默认禁用localStorage,但似乎是这样的?我也在其他网站上测试过,但运气不好。我甚至试着用这个网站来测试它,但它似乎并没有因为一些奇怪的原因而保存任何东西 有没有人有过同样的问题,只是他们幸运地解决了?我应该切换我的存储方法吗 我试图通过只存储几行信息来调试它,但没有效果。我使用了标准的Javascript QuoteExceedeError:Dom异常22:试图向存储中添加超出配额的内容,javascript,iphone,html,local-storage,Javascript,Iphone,Html,Local Storage,在iPhone和iOS 7上使用LocalStorage会引发此错误。我一直在寻找一个解决方案,但考虑到我甚至没有私下浏览,没有什么是相关的 我不明白为什么在iOS 7中默认禁用localStorage,但似乎是这样的?我也在其他网站上测试过,但运气不好。我甚至试着用这个网站来测试它,但它似乎并没有因为一些奇怪的原因而保存任何东西 有没有人有过同样的问题,只是他们幸运地解决了?我应该切换我的存储方法吗 我试图通过只存储几行信息来调试它,但没有效果。我使用了标准的localStorage.setI
localStorage.setItem()
函数来保存。(有些设备没有模拟器)
看起来iOS 7中的Safari具有较低的存储配额,这显然是通过具有较长的历史记录日志实现的
我想最好的做法是抓住例外
Modernizer项目有一个简单的补丁,您应该尝试类似的方法:当Safari处于私人模式浏览时,可能会出现这种情况。在私人浏览中,本地存储根本不可用 一种解决方案是警告用户应用程序需要非私有模式才能工作
更新:这已在中修复,因此该行为现在与其他浏览器一致。如其他答案中所述,在调用
localStorage.setItem
(或sessionStorage.setItem
)时,在iOS和OS X上的Safari专用浏览器模式下,您总是会收到QuoteExceedeError
一种解决方案是在使用setItem
的每个实例中执行try/catch或
但是,如果您希望使用一个垫片来全局停止抛出此错误,以防止其余JavaScript中断,您可以使用以下方法:
正如在其他答案中已经解释的那样,在私人浏览模式下,Safari在尝试使用
localStorage.setItem()
保存数据时总是抛出此异常
为了解决这个问题,我编写了一个模拟localStorage的伪localStorage,包括方法和事件
伪本地存储:
这可能不是解决这个问题的好办法。对于我的场景来说,这是一个很好的解决方案,替代方案是对现有应用程序进行重大的重新写入。我使用这个简单的函数,它返回
true
或false
,以测试本地存储的可用性:
isLocalStorageNameSupported = function() {
var testKey = 'test', storage = window.sessionStorage;
try {
storage.setItem(testKey, '1');
storage.removeItem(testKey);
return true;
} catch (error) {
return false;
}
}
现在,您可以在使用它之前测试localStorage.setItem()
的可用性。例如:
if ( isLocalStorageNameSupported() ) {
// can use localStorage.setItem('item','value')
} else {
// can't use localStorage.setItem('item','value')
}
更新(2016-11-01)
我使用下面提到的AmplifyJS来解决这个问题。然而,对于私人浏览中的Safari,它正在退回到基于内存的存储。在我的例子中,这是不合适的,因为这意味着即使用户仍在私人浏览,也会在刷新时清除存储
另外,我注意到一些用户总是在iOS Safari上以私人模式浏览。因此,Safari的一个更好的退路是使用cookies(如果可用)。默认情况下,即使在私人浏览中也可以访问cookie。当然,它们在退出私人浏览时会被清除,但在刷新时不会被清除
我找到了图书馆。从文件中:
目的
对于“私人浏览”等浏览器设置,即使在较新的浏览器中,依赖工作window.localStorage也成了一个问题。即使它可能存在,在尝试使用setItem或getItem时也会抛出异常。此模块将运行适当的检查,以查看可用的浏览器存储机制,然后将其公开。它使用与localStorage相同的API,因此在大多数情况下,它应该作为替代品使用
当心哥特人:
- CookieStorage有存储限制。这里要小心
- MemoryStorage在页面加载之间不会持久存在。这或多或少是防止页面崩溃的权宜之计,但对于不进行完整页面加载的网站来说可能已经足够了
.getItem(prop)
和.setItem(prop,val)
一起使用的统一API):
检查并使用适用于浏览器的存储适配器(本地存储、会话存储、cookie、内存)
原始答案
为了补充前面的答案,一个可能的解决方法是更改存储方法。有一些像和这样的图书馆可以提供帮助。两个lib都允许通过几个后端进行持久的客户端存储
对我来说
本地存储
- IE 8+
- 火狐3.5+
- 狩猎4+
- 铬
- 歌剧10.5+
- iPhone2+
- 安卓2+
- IE 8+
- 火狐2+
- 狩猎4+
- 铬
- 歌剧10.5+
- iPhone2+
- 安卓2+
- 火狐2+
- IE 5-7
- userData也存在于IE的较新版本中,但由于IE9实现中的一些怪癖,如果使用localStorage,我们不会注册userData 支持
- 如果其他存储类型均不可用,则提供内存中存储作为备用存储
- 闪存:闪存8持久存储
- gears:基于Google gears的持久存储
- 本地存储:HTML5草稿存储
- globalstorage:HTML5草稿存储(旧规范)
- ie:Internet Explorer用户数据行为
- cookie:基于cookie的持久存储
if ( isLocalStorageNameSupported() ) {
// can use localStorage.setItem('item','value')
} else {
// can't use localStorage.setItem('item','value')
}
function localStorageGet( pKey ) {
if( localStorageSupported() ) {
return localStorage[pKey];
} else {
return docCookies.getItem( 'localstorage.'+pKey );
}
}
function localStorageSet( pKey, pValue ) {
if( localStorageSupported() ) {
localStorage[pKey] = pValue;
} else {
docCookies.setItem( 'localstorage.'+pKey, pValue );
}
}
// global to cache value
var gStorageSupported = undefined;
function localStorageSupported() {
var testKey = 'test', storage = window.sessionStorage;
if( gStorageSupported === undefined ) {
try {
storage.setItem(testKey, '1');
storage.removeItem(testKey);
gStorageSupported = true;
} catch (error) {
gStorageSupported = false;
}
}
return gStorageSupported;
}
localStorageSet( 'foobar', 'yes' );
...
var foo = localStorageGet( 'foobar' );
...