Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

localStorage 为 null 的奇葩环境

  之前的文章喷过 Safari 下 localStorage 的坑。当时只是喷喷而已,还没遇到过实际问题。然而这回还这遇上了这样的奇葩问题,由于某个 App 的 WebView 关闭了 localStorage 的支持,在其页面上全局的 localStorage 变成了一个 configurable false 的 null。
  我一开始的兼容代码是判断 localStorage 是否可以调用 setItem 之类的方法,因为 Safari 的隐身模式下调用会报错,所以尝试调用如果失败的话就自己写一个 setItem、getItem 等方法来防止浏览器报错。后来我发现,这个兼容代码居然直接挂掉了!我突然觉得不妙,感觉马上就要掉入一个深坑中的样子。
  由于 localStorage 这个全局变量的值为 null,所以我给 localStorage.setItem 赋值就直接报错了。然后我自以为找到了原因,在前面写了个 var localStorage = window.localStorage || {};   目的是确保 localStorage 总是一个对象。当我兴致勃勃地提交的代码测试以后发现依然是报原来的错。当时还以为是 App 的缓存问题又折腾了好久。于是就猜测莫非这个 localStorage 是 writable false 的?于是我又更新了代码 var localStorage;
if(!localStorage) {
  delete localStorage;
  localStorage {};
}
  如果它不存在的话就先把这个变量删除掉然后重启赋值。这样即使 writable false 也会被重置掉。然后我又屁颠屁颠地提交了代码,结果尼玛还是那个神奇的错误。然后我才想这货莫非和 Safari 一样又臭又硬?是个 configurable false 的 null ?
  于是 polyfill 方案以失败告终(好像确实没有办法修改一个 writable false 且 configurable false 的属性值)。
  最后实在没办法了就到项目里把所有 localStorage 这个关键字替换成别的。也就是在 localStorage 外面再包一层。我知道这个办法很蠢,但是找不到别的办法所以就先这么上了。也许最终的办法应该是让 App 把 WebView 的 localStorage 支持开起来(然而当时接入的是第三方的 App,没法这么玩)。
  聪明的你告诉我,这个悲伤的故事给了人们什么启示呢?
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^