HTML5 localStorage.setItem无法在iOS 8上运行 - Safari mobile

时间:2015-05-05 08:38:58

标签: javascript local-storage ios8.3

localStorage.setItem无法在移动iOS 8.3上运行。

有人遇到过这个问题吗? 这是代码:

var storage = window.localStorage;
storage.setItem('test',45);
alert(storage.getItem('test'));

2 个答案:

答案 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是否可用。