我的 web 应用程序在 ios safari 隐私浏览中有 javascript 错误:
JavaScript:错误
不明确的
QUOTA_EXCEEDED_ERR:DOM 异常 22:尝试向存储中添加内容...
我的代码:
localStorage.setItem('test',1)
我的 web 应用程序在 ios safari 隐私浏览中有 javascript 错误:
JavaScript:错误
不明确的
QUOTA_EXCEEDED_ERR:DOM 异常 22:尝试向存储中添加内容...
我的代码:
localStorage.setItem('test',1)
显然这是设计使然。当 Safari(OS X 或 iOS)处于隐私浏览模式时,它看起来好像localStorage
可用,但尝试调用setItem
会引发异常。
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
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;
}
}
上面链接上发布的修复程序对我不起作用。这做到了:
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
正如其他答案中提到的,当localStorage.setItem
(或sessionStorage.setItem
) 被调用时,在 iOS 和 OS X 上的 Safari Private Browser Mode 中,您总是会得到 QuotaExceededError 。
一种解决方案是在每个 using 实例中进行try/catch 或Modernizr 检查setItem
。
但是,如果您想要一个简单地全局停止抛出此错误的 shim,以防止其余 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.');
}
}
在我的上下文中,刚刚开发了一个类抽象。当我的应用程序启动时,我通过调用getStorage()检查 localStorage 是否正常工作。此函数还返回:
在我的代码中,我从不直接调用 localStorage。我调用cusSto全局变量,我已经通过调用getStorage() 进行了初始化。
这样,它适用于隐私浏览或特定的 Safari 版本
function getStorage() {
var storageImpl;
try {
localStorage.setItem("storage", "");
localStorage.removeItem("storage");
storageImpl = localStorage;
}
catch (err) {
storageImpl = new LocalStorageAlternative();
}
return storageImpl;
}
function LocalStorageAlternative() {
var structureLocalStorage = {};
this.setItem = function (key, value) {
structureLocalStorage[key] = value;
}
this.getItem = function (key) {
if(typeof structureLocalStorage[key] != 'undefined' ) {
return structureLocalStorage[key];
}
else {
return null;
}
}
this.removeItem = function (key) {
structureLocalStorage[key] = undefined;
}
}
cusSto = getStorage();
Safari 11 似乎改变了行为,现在本地存储在私人浏览器窗口中工作。万岁!
我们曾经在 Safari 隐私浏览中失败的网络应用程序现在可以完美运行。它在 Chrome 的隐私浏览模式下始终运行良好,该模式始终允许写入本地存储。
这记录在 Apple 的Safari Technology Preview 发行说明和WebKit 发行说明中,适用于 2017 年 5 月发布的第 29 版。
具体来说: