QuotaExceededError:Domexception22:尝试将某些内容添加到超过配额的存储中

在iOS 7上使用iPhone上的LocalStorage会引发此错误。 我一直在寻找解决scheme,但考虑到我甚至没有私下浏览,没有什么是相关的。

我不明白为什么localStorage在默认情况下会在iOS 7中被禁用,但似乎是? 我也在其他网站上testing,但没有运气。 我甚至尝试过使用这个网站进行testing: http : //arty.name/localstorage.html ,但似乎并不是因为一些奇怪的原因而保存任何东西。

有没有人有同样的问题,只有他们有运气修复它? 我应该切换存储方式吗?

我试图通过只存储几行信息来进行debugging,但无济于事。 我用标准的localStorage.setItem()函数来保存。

当Safari处于私人模式浏览时,可能会发生这种情况。 在隐私浏览中,本地存储根本不可用。

一个解决scheme是警告用户应用程序需要非私人模式才能工作。

更新:这已在Safari 11中修复,所以行为现在与其他浏览器alignment。

正如其他答案中所提到的,当调用localStorage.setItem (或sessionStorage.setItem )时,您将始终在iOS和OS X上以Safari私有浏览器模式获取QuotaExceededError。

一个解决scheme是在使用setItem每个实例中执行try / catch或Modernizr检查 。

但是,如果你想要一个简单的全局停止这个错误被抛出,以防止其余的JavaScript中断,你可以使用这个:

https://gist.github.com/philfreo/68ea3cd980d72383c951

 // Safari, in Private Browsing Mode, looks like it supports localStorage but all calls to setItem // throw QuotaExceededError. We're going to detect this and just silently drop any calls to setItem // to avoid the entire page breaking, without having to do a check at each usage of Storage. if (typeof localStorage === 'object') { try { localStorage.setItem('localStorage', 1); localStorage.removeItem('localStorage'); } catch (e) { Storage.prototype._setItem = Storage.prototype.setItem; Storage.prototype.setItem = function() {}; alert('Your web browser does not support storing settings locally. In Safari, the most common cause of this is using "Private Browsing Mode". Some settings may not save or some features may not work properly for you.'); } } 

我使用这个简单的函数返回true或者false来testinglocalStorage的可用性:

 isLocalStorageNameSupported = function() { var testKey = 'test', storage = window.sessionStorage; try { storage.setItem(testKey, '1'); storage.removeItem(testKey); return true; } catch (error) { return false; } } 

现在,您可以在使用它之前testinglocalStorage.setItem()可用性。 例:

 if ( isLocalStorageNameSupported() ) { // can use localStorage.setItem('item','value') } else { // can't use localStorage.setItem('item','value') } 

我偶然在iOS 7中运行相同的问题 (一些设备没有模拟器)。

看起来像iOS 7中的Safari有一个较低的存储配额,这显然是由历史悠久的日志达到。

我想最好的做法是赶上例外。

Modernizr项目有一个简单的补丁,你应该尝试类似的东西: https : //github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js

这是一个扩展的解决scheme基于DrewT上面的答案,如果localStorage不可用,使用cookie。 它使用Mozilla的docCookies库 :

 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' ); ... 

要添加以前的答案,一种可能的解决方法是更改​​存储方法。 有一些馆藏如AmplifyJS和PersistJS可以提供帮助。 两个库允许持久的客户端存储通过几个后端。

对于AmplifyJS

localStorage的

  • IE 8+
  • Firefox 3.5+
  • Safari 4+
  • Opera 10.5+
  • iPhone 2+
  • Android 2+

的sessionStorage

  • IE 8+
  • Firefox 2+
  • Safari 4+
  • Opera 10.5+
  • iPhone 2+
  • Android 2+

globalStorage的

  • Firefox 2+

用户数据

  • IE 5 – 7
  • userData也存在于较新版本的IE中,但是由于IE9的实现中有怪癖,如果支持localStorage,我们不会注册userData。

记忆

  • 如果没有其他存储types可用,则提供内存中存储作为回退。

对于PersistentJS

  • Flash:Flash 8持久存储。
  • 齿轮:基于Google Gears的持久性存储。
  • localstorage:HTML5草稿存储。
  • globalstorage:HTML5草稿存储(旧规格)。
  • 即:Internet Explorer用户数据行为。
  • cookie:基于Cookie的持久存储。

他们提供了一个抽象层,所以你不必担心select存储types。 请记住,根据存储types的不同,可能会有一些限制(如大小限制)。 现在,我正在使用AmplifyJS,但是我仍然需要在iOS 7 / Safari /等上进行更多的testing。 看看它是否真的解决了这个问题。

正如其他答案中已经解释的那样, 当处于隐私浏览模式时, Safari会在尝试使用localStorage.setItem()保存数据时始终抛出此exception。

为了解决这个问题,我写了一个模拟localStorage的虚拟localStorage,包括方法和事件。

假本地存储: https : //gist.github.com/engelfrost/fd707819658f72b42f55

这可能不是一个很好的通用解决scheme。 这对我的scheme来说是一个很好的解决scheme,在这种情况下,替代scheme将主要重写到已经存在的应用程序中。

2017年4月,一个补丁被合并到Safari中,所以与其他浏览器一致。 这是与Safari 11发布的。

https://bugs.webkit.org/show_bug.cgi?id=157010

这个问题和答案帮助我解决了在Parse中注册新用户的具体问题。

由于signUp(attrs,options)函数使用本地存储来保持会话,因此如果用户处于隐私浏览模式,则会引发“QuotaExceededError:DOMexception22:尝试向超过配额的存储添加内容”。 exception和成功/错误function从来没有被调用。

在我的情况下,因为错误函数从来没有被调用,它最初似乎是在提交点击事件或注册成功时定义的redirect的问题。

包括用户警告解决了这个问题。

parsingJavascript SDK参考 https://parse.com/docs/js/api/classes/Parse.User.html#methods_signUp

使用用户名(或电子邮件)和密码login新用户。 这将在服务器上创build一个新的Parse.User, 并将该会话保存在localStorage中,以便您可以使用{@link #current}来访问该用户。