在Windows 7上的IE11中损坏的JavaScript localStorage对象
Internet Explorer 11(Windows 7版本)中的localStorage
对象包含特定函数的string表示forms,而不是您所期望的本地调用forms。
这只与香草JavaScript和像JSFiddle这样的网站没有这个代码没有问题,但我怀疑这是因为有localStorage
polyfill到位,纠正它。
以这个HTML页面代码为例:
<!DOCTYPE html> <script> localStorage.setItem('test', '12345'); alert(localStorage.getItem('test')); localStorage.clear(); </script>
除了IE11以外,我的所有浏览器都能正常工作。 第一行' SCRIPT5002:预期function '发生错误。
看看IE开发人员工具控制台中实际上是什么types的setItem
函数,说明它是一个string…?
typeof localStorage.setItem === 'string' // true
打印出setItem
的string显示如下:
"function() { var result; callBeforeHooks(hookSite, this, arguments); try { result = func.apply(this, arguments); } catch (e) { callExceptHooks(hookSite, this, arguments, e); throw e; } finally { callAfterHooks(hookSite, this, arguments, result); } return result; }"
奇怪的是,并不是所有的函数都被replace为string,例如,相应的getItem
函数确实是一个函数,并按预期工作。
typeof localStorage.getItem === 'function' // true
将文档模式(仿真)更改为10或9仍然不能解决问题,并导致相同的错误。 如果将文档模式更改为8,则会出现以下错误:“ 对象不支持此属性或方法 ”,因为IE8不支持localStorage
。
是否有其他人在Windows 7上的IE11的localStorage
对象似乎“破碎/腐败”相同的问题?
原来这是Windows 7 SP1的基本版IE11(11.0.9600.16428)中的一个问题。
安装修补程序以更新到11.0.9600.16476(更新版本11.0.2 – KB2898785)后,问题得到解决。 在其他版本的Windows(32位等)的链接可以在修补程序下载页面的底部find。
这不仅是IE11的错误。
可能WEINRE被注入页面。 它挂钩了几个系统函数来提供开发者工具的function ,但是IE11解释了对localStorage
和sessionStorage
属性的赋值错误,并且把钩子函数转换成string,就好像它们是要存储的数据一样。
在apache / cordova-weinre回购中有一个评论 :
#In IE we should not override standard storage functions because IE does it incorrectly - all values that set as # storage properties (eg localStorage.setItem = function()[...]) are cast to String. # That leads to "Function expected" exception when any of overridden function is called. object[property] = hookedFunction unless navigator.userAgent.match(/MSIE/i) and (object is localStorage or object is sessionStorage)
看起来这是WEINRE的旧版本,或者这个改变还没有正式发布( 自2013年以来就一直存在 )。