首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Safari的html5 localStorage错误:"QUOTA_EXCEEDED_ERR: DOM异常22:试图向存储添加超出配额的内容。“

Safari的html5 localStorage错误:"QUOTA_EXCEEDED_ERR: DOM异常22:试图向存储添加超出配额的内容。“
EN

Stack Overflow用户
提问于 2013-01-28 12:16:31
回答 15查看 151.5K关注 0票数 134

我的webapp在ios safari私人浏览中有javascript错误:

JavaScript:错误

未定义

QUOTA_EXCEEDED_ERR:DOM异常22:尝试将某些内容添加到存储...

我的代码:

代码语言:javascript
复制
localStorage.setItem('test',1)
EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2013-01-28 12:18:41

显然这是设计好的。当Safari (OS或iOS)处于私人浏览模式时,似乎可以使用localStorage,但是尝试调用setItem会抛出一个异常。

代码语言:javascript
复制
store.js line 73
"QUOTA_EXCEEDED_ERR: DOM Exception 22: An attempt was made to add something to storage that exceeded the quota."

实际情况是,window对象仍然在全局名称空间中公开localStorage,但是当您调用setItem时,将抛出此异常。对removeItem的任何调用都将被忽略。

我认为最简单的解决方法(尽管我还没有测试过这个跨浏览器)是修改函数isLocalStorageNameSupported(),以测试您也可以设置一些值。

https://github.com/marcuswestin/store.js/issues/42

代码语言:javascript
复制
function isLocalStorageNameSupported() 
{
    var testKey = 'test', storage = window.sessionStorage;
    try 
    {
        storage.setItem(testKey, '1');
        storage.removeItem(testKey);
        return localStorageName in win && win[localStorageName];
    } 
    catch (error) 
    {
        return false;
    }
}
票数 186
EN

Stack Overflow用户

发布于 2013-07-12 06:40:05

在上面的链接上发布的修复对我不起作用。这样做了:

代码语言:javascript
复制
function isLocalStorageNameSupported() {
  var testKey = 'test', storage = window.localStorage;
  try {
    storage.setItem(testKey, '1');
    storage.removeItem(testKey);
    return true;
  } catch (error) {
    return false;
  }
}

http://m.cg/post/13095478393/detect-private-browsing-mode-in-mobile-safari-on-ios5派生

票数 38
EN

Stack Overflow用户

发布于 2014-11-23 03:17:30

正如在其他答案中提到的,当调用localStorage.setItem (或sessionStorage.setItem)时,您将始终在iOS和OS上获得Safari Private Browser模式下的QuotaExceededError。

一种解决方案是在每个使用setItem的实例中执行一次try/catch或Modernizr check

但是,如果您想要一个简单地全局阻止抛出此错误的填充程序,以防止JavaScript的其余部分崩溃,您可以使用以下命令:

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

代码语言:javascript
复制
// 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.');
    }
}
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14555347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档