localStorage.setItem
无法在移动iOS 8.3上运行。
有人遇到过这个问题吗? 这是代码:
var storage = window.localStorage;
storage.setItem('test',45);
alert(storage.getItem('test'));
答案 0 :(得分:4)
过去,我们可以使用类似的东西:
if ('localStorage' in window && window.localStorage !== null) {
alert('can use');
}else{
alert('cannot use');
}
或
if (localStorage === undefined) {... }
但是,在iOS 8.3+中,当用户禁用Cookie 时,此代码会抛出未处理的JavaScript错误。当用户进入隐私浏览模式时,当您尝试写入localStorage时会出现相同的错误消息。
SecurityError:DOM异常18:尝试突破 用户代理的安全策略。
解决方法强>
为了避免由于iOS的这种特殊行为导致的不必要的JavaScript错误,一个建议是将其包含在try catch块中。 (至少暂时)
try{
if ('localStorage' in window && window.localStorage !== null) {
localStorage.setItem('testLocalStorage', 'testLocalStorage');
if (localStorage.getItem('testLocalStorage') !== 'testLocalStorage') {
localStorage.removeItem('testLocalStorage');
//for private browsing, error is thrown before even getting here
alert('can read CANNOT write');
}else{
localStorage.removeItem('testLocalStorage');
alert('can use');
}
}else{
alert('CANNOT use');
}
}catch(ex){
alert('CANNOT use reliably');
}
注意:这不是在实际代码中使用警报的建议。这只是为了快速说明。
可能的缩写
try {
localStorage.setItem('testLocalStorage', 'testLocalStorage');
localStorage.removeItem('testLocalStorage');
alert('supported');
} catch(ex) {
alert('unsupported');
}
我们可以使用什么
对于不支持localStorage的情况,可能的替代方案包括服务器会话(如果不支持cookie,则基于URL参数),或者用于存储序列化数据的window.name变量。
或者,如果您设计和构建为单页应用程序,可能根本不需要将数据存储在全局命名空间中。
答案 1 :(得分:0)
在使用之前,您应该使用if ('localStorage' in window && window.localStorage !== null) { ...
之类的代码检查localStorage是否可用。