在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解释了对localStoragesessionStorage属性的赋值错误,并且把钩子函数转换成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年以来就一直存在 )。