Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript QuoteExceedeError:Dom异常22:试图向存储中添加超出配额的内容_Javascript_Iphone_Html_Local Storage - Fatal编程技术网

Javascript QuoteExceedeError:Dom异常22:试图向存储中添加超出配额的内容

Javascript QuoteExceedeError:Dom异常22:试图向存储中添加超出配额的内容,javascript,iphone,html,local-storage,Javascript,Iphone,Html,Local Storage,在iPhone和iOS 7上使用LocalStorage会引发此错误。我一直在寻找一个解决方案,但考虑到我甚至没有私下浏览,没有什么是相关的 我不明白为什么在iOS 7中默认禁用localStorage,但似乎是这样的?我也在其他网站上测试过,但运气不好。我甚至试着用这个网站来测试它,但它似乎并没有因为一些奇怪的原因而保存任何东西 有没有人有过同样的问题,只是他们幸运地解决了?我应该切换我的存储方法吗 我试图通过只存储几行信息来调试它,但没有效果。我使用了标准的localStorage.setI

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

我不明白为什么在iOS 7中默认禁用localStorage,但似乎是这样的?我也在其他网站上测试过,但运气不好。我甚至试着用这个网站来测试它,但它似乎并没有因为一些奇怪的原因而保存任何东西

有没有人有过同样的问题,只是他们幸运地解决了?我应该切换我的存储方法吗

我试图通过只存储几行信息来调试它,但没有效果。我使用了标准的
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在页面加载之间不会持久存在。这或多或少是防止页面崩溃的权宜之计,但对于不进行完整页面加载的网站来说可能已经足够了
TL;博士: 使用(与
.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 支持
记忆

  • 如果其他存储类型均不可用,则提供内存中存储作为备用存储
对于PersistentJS

  • 闪存:闪存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' );
...