Safari Private 模式下 localStorage 的问题
这种模式下浏览网页踏雪无痕,雁过不留声。具体来说,与正常模式的区别是浏览器不会保存历史记录,没有页面缓存,所有本地数据也都是临时的,页面关闭后无法还原。譬如本文下面要讲到的 并不是说这种模式下绝对安全,服务器仍然对用户的浏览是有感知的。所以 IP 什么的依然可以追踪。 --------- LOG ---------
00:01:00 - 一位不具名用户在零点零一分进行了访问
00:02:00 - 一位不愿透露姓名的用户在零点零二分打开了你丢弃在服务器 `社会科学/东方艺术鉴赏/东瀛浮世绘` 中的资源 `ae2bx86.jpg` 从功能上来说,普通用户大概鲜有人知道这一功能(产品情怀就这样被用户无视,PM 们默默泪目),而开发者则利用其干净的特点来开发调试,排除程序之外的因素导致 bug 的可能。 因为所有本地数据都是临时的,那么问题来了,如果网页代码中还使用了诸如 答案是肯定的,但只针对本次访问。这个肯定只限于桌面浏览器。 而手机端则不然。 iOS 上 Safari private 模式下浏览器假装支持 QUOTA_EXCEEDED_ERR:DOM Exception 22:An attempt was made to add something to storage... 考察下面的测试代码: <button class="setValue">SET</button>
<hr>
<button class="getValue">GET</button>
<script>
var q = document.querySelector;
document.querySelector('.setValue').onclick = function () {
try {
var time = new Date().getTime();
localStorage.setItem('time', time);
alert('set '+time);
} catch (error) {
alert(JSON.stringify(error));
}
}
document.querySelector('.getValue').onclick = function () {
var content = localStorage.getItem('time', new Date().getTime());
alert('got '+content);
}
</script> 我在页面放了两个按钮,一个用于向浏览器保存值,一个用于获取。 下面是测试结果: 这表明在 iOS 上,不仅是 Safari 在隐私模式中不能使用 博主是谷粉,很早就入手了 Nexus。本着严谨的做事态度,那肯定也得拿来测试一下丫。而安卓机上的测试则让人无法接受。 是的,安卓上面并没有表现出假装支持 回过头来想,隐私模式主要的功能不就是让用户的数据不被追踪吗,如果能够存取数据的话,反而没那么隐私了。从这点来说, 问题想当于回到了开发者手中,我们在开发过程中使用 下面是兼容代码示例: function isLocalStorageSupport(){
try {
var isSupport = 'localStorage' in window && window['localStorage'] !== null;
if (isSupport) {
localStorage.setItem('__test', '1');
localStorage.removeItem('__test');
}
return isSupport;
} catch (e) {
return false;
}
} 为此,我们可以考虑提取一个辅助类来封装 |