小谈Safari无痕模式
Jun 27, 2018
开发H5 webapp时经常需要使用本地存储,与最多能存4k的cookie相比,localStorage和sessionStorage的优势明显。因此在公司的一个项目中我是用了localStorage来替代cookie。但是却不知道缺隐藏着一些未知因素。事情是这样的,客服说有一个用户怎么都登录不了,明明用户名密码是正确的,但就是登录不了,很是奇怪。经过一番的折腾才明白,原来用户使用的Safari的无痕模式浏览,localStorage对象仍然存在,但是localStorage的setItem对象会报出异常QuotaExceededError,getItem和removeItem则直接忽略(undefined)。这相当于你有一台手机但是却打不了电话…
解决
知道了原因以后就好解决了,当时的思路是两个:
- 每当遇到存储操作时判断是否是无痕模式,是无痕模式就使用cookie,不是就使用sessionStorage
- 整套换掉使用cookie
个人倾向于第二种的,但是当时大佬说用第一种。那么说干就干,由于我们使用的是zepto.js而且zepto.cookie.js只提供了set的方法,所以还需要自己封装cookie操作。首先我们来看怎么判断是否为无痕模式,使用try/catch就可以判断了,如果报出异常就是无痕模式,使用cookie,反之就使用localStorage。
1 | // 判断是否为无痕模式 |
然后我们定义一个storage对象:
1 | var storage = { |
看来以后在移动端使用localStorage和sessionStorage还是要小心啊,注意Safari这一个坑。