前言

Safari开启无痕模式后,localStorage和sessionStorage为空,对其进行set操作也会报错,也就是说这种情况下,storage是被禁止使用了。接下来说一下解决方法。

解决方案

我们项目框架上的解决方法是对storage进行一层封装,遇到这种开启无痕模式的情况,会定义一个window的全局变量,把之前准备存放到storage的内容改为存到这个全局变量中。

注意,无痕模式下localStorage和sessionStorage对象本身依然是存在的,只是调用setItem方法是会报错。下面是无痕模式下报错的截图:

所以正确的判断代码应该是这样:

  try {
sessionStorage.setItem('private_test', 1);
} catch (e) {
//无痕模式
}

我们会另外定义一个NameStorage对象,在原生storage失效时使用:

 // 隐私模式下面,把临时值存到window.name中去
function NameStorage(type) {
this.store = NameStorage[type];
} Object.assign(NameStorage.prototype, {
getItem: function(key) {
return this.store[key];
},
setItem: function(key, value) {
this.store[key] = value;
this._saveNameValue();
},
removeItem: function(key) {
delete this.store[key];
this._saveNameValue();
},
clear: function() {
this.store = {};
this._saveNameValue();
},
_saveNameValue: function() {
var ret = {
session: NameStorage.session,
local: NameStorage.local
} window.name = JSON.stringify(ret);
}
});

上面会把所有的local和session数据存储到window.name上去,然后在每个页面启动时,调用一下keepName方法,把window.name的数据拿下来放到NameStorage上面。这时候,只需要调用new NameStorage('local')来代替localStorage进行操作就行了

 function keepName () {
if (keepName.done) {
return;
} var ret; if (window.name) {
try {
ret = JSON.parse(window.name);
} catch (e) {
ret = {};
}
} if (!_.isPlainObject(ret)) {
ret = {};
} if (!ret.session) {
ret.session = {};
} if (!ret.local) {
ret.local = {};
} NameStorage.session = ret.session;
NameStorage.local = ret.local;
keepName.done = true;
}

另外一些补充

● 无痕模式下,localStorage和sessionStorage的报错信息是:QuotaExceededError,code为22,这个其实是storage存储空间用完了报的错,就比如当前浏览器storage内存为5mb,你已经存储了5mb的数据后,再进行setItem操作就会报这个错误。

● 所以我猜想无痕模式下,浏览器是把storage的内存先清空,然后再设置最大值为0,这样调用setItem就直接报错了。

● 另外无痕模式下cookie是可以使用的,大概因为cookie是跟服务器有关,而storage是属于浏览器的特性吧。

● 最后还有一种情况,就是无痕模式下打开了某个页面,然后把浏览器关闭再打开,这个时候会打开访问的页面,但是window.name已经丢失了,所以就拿不到以前存储的数据了。这种情况只能页面做容错处理了。

Safari无痕模式下,storage被禁用问题的更多相关文章

  1. Safari Private 模式下 localStorage 的问题

    现如今好多浏览器都有「隐身模式」,Safari 管这叫「Private Browing」,国内各种牌子的套壳浏览器叫「无痕浏览」.私以为从命名上来说,倒是国内更中文一些. 这种模式下浏览网页踏雪无痕, ...

  2. Safari无痕模式是不能只使用localStorage存储数据要用Cookie做补丁

    safari 无痕浏览情况测试(部分手机)   1.测试机型 iPhone7 Plus  版本 11.3 iPhone6 Plus  版本 11.3.1 iPhone6    版本 10.2.1 iP ...

  3. 无痕模式下 this.StorageManager.setItem) 本地存储丢失

    在无痕模式下,存的this.StorageManager.setItem("recharge", JSON.stringify(recharge))本地存储会丢失,所以我们改成使用 ...

  4. 在IOS手机safari浏览器的无痕模式下,localStorage不起作用

    无痕模式是黑色风格,正常模式是白色风格.在无痕模式中,使用localStorage.setItem()会报错,但在window对象下确实有localStorage.setItem方法. if (typ ...

  5. localStorage、sessionStorage在无痕模式下被禁用

    在移动web开发中,经常会使用到localStorage去缓存一些数据,一般情况下,我们只需要按照下面的代码去使用就不会有 问题. if(window.localStorage){ localStor ...

  6. ios中safari无痕浏览模式下,localStorage的支持情况

    前言 前阶段,测试提了个bug,在苹果手机中无痕模式下,搜索按钮不好使,无法跳页,同时搜索历史也没有展示(用户搜索历史时使用localStorage存储). 正文 iOS上Sarfari在无痕模式下, ...

  7. 一次由于开启 Safari 无痕浏览 引发的艰难“捉虫”事件

    事件回顾 做了一个移动端的页面,测试的时候出现了一个诡异的 bug.别的浏览器都好好的,就 ios 的 Safari 浏览器页面停止了渲染,似乎是有一段 js 文件没有载入.但是奇怪的是,同一型号的 ...

  8. 苹果手机Safari无痕浏览模式下系统登录成功但是页面不跳转

    昨天下午,测试提了一个bug,问题是:在苹果手机Safari无痕浏览模式下系统登录成功但是页面不跳转. 思前想后找了半天没思路,后来经过同事的点拨,说可能是禁用了cookie之类的,反正我也没思路就顺 ...

  9. MUI - myStorage在ios safari无痕浏览模式下的解决方案

    myStorage在ios safari无痕浏览模式下的解决方案 今天看到了这个帖子LocalStorage 在 Private Browsing 下的一个限制, 吓尿了,如果用户开启了无痕浏览,ap ...

随机推荐

  1. [译文]casperjs使用说明-测试

    capserjs自带了一个测试框架,它提供了一个使你能够更容易的测试你的web应用的工具集. 注意: 1.1版本变更 这个测试框架,包括它的所有API,仅能使用在casperjs test子命令下 如 ...

  2. 循环神经网络RNN原理

    一.循环神经网络简介 循环神经网络,英文全称:Recurrent Neural Network,或简单记为RNN.需要注意的是,递归神经网络(Recursive Neural Network)的简写也 ...

  3. static成员变量和static成员函数例程

    #include "pch.h" #include <iostream> using namespace std; class goods { public: good ...

  4. 海思hi35xx 开发学习(3):视频输入

    视频输入(VI)模块实现的功能:通过 MIPI Rx(含 MIPI 接口.LVDS 接口和 HISPI 接口),SLVS-EC,BT.1120,BT.656,BT.601,DC 等接口接收视频数据.V ...

  5. bzoj2959: 长跑(LCT+并查集)

    题解 动态树Link-cut tree(LCT)总结 LCT常数大得真实 没有环,就是\(lct\)裸题吧 有环,我们就可以绕环转一圈,缩点 怎么搞? 当形成环时,把所有点的值全部加到一个点上,用并查 ...

  6. 128th LeetCode Weekly Contest Capacity To Ship Packages Within D Days

    A conveyor belt has packages that must be shipped from one port to another within D days. The i-th p ...

  7. Q791 自定义字符串排序

    字符串S和 T 只包含小写字符.在S中,所有字符只会出现一次. S 已经根据某种规则进行了排序.我们要根据S中的字符顺序对T进行排序.更具体地说,如果S中x在y之前出现,那么返回的字符串中x也应出现在 ...

  8. python学习15-序列化(转载)

    序列化是指把内存里的数据类型转换成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘和网络传输时只能接受bytes 一.pickle 把python对象写入到文件中的一种解决方案,但是写入到文件 ...

  9. 【数据服务中间件】一、HttpServlet

    一.概念 Servlet的框架是由两个Java包组成:javax.servlet和javax.servlet.http GenericServlet和HttpServlet 3个方法代表了Servle ...

  10. java email

    package email; import java.io.File;import java.util.Date;import java.util.Properties; import javax.a ...