繁体   English   中英

JavaScript localStorage 对象在 Windows 7 上的 IE11 中损坏

[英]JavaScript localStorage object broken in IE11 on Windows 7

Internet Explorer 11(Windows 7 版本)中的localStorage对象包含某些函数的字符串表示,而不是您期望的本机调用。

这只会破坏原生 JavaScript,并且像 JSFiddle 这样的网站对这段代码没有问题,但我怀疑这是因为有localStorage polyfills 可以纠正它。

以这个 HTML 页面代码为例:

<!DOCTYPE html>
<script>
  localStorage.setItem('test', '12345');
  alert(localStorage.getItem('test'));
  localStorage.clear();
</script>

这在我安装的所有浏览器中都非常有效,除了 IE11。 第一行“ SCRIPT5002: Function expected ”发生错误。

看看 IE 开发人员工具控制台中setItem函数实际上是什么类型,声明它是一个字符串......?

    typeof localStorage.setItem === 'string' // true

打印出setItem的字符串显示如下:

"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;
}"

奇怪的是,并不是所有的函数都被字符串替换了,例如对应的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 位等)的链接。

这不仅仅是 IE11 的错。

可能WEINRE被注入到页面中。 挂钩到几个系统函数中以提供开发者工具功能,但 IE11 错误地解释了对localStoragesessionStorage属性的分配,并将挂钩函数转换为字符串,就好像它们是将要存储的数据一样。

apache/cordova-weinre repo 中一条评论说:

        #In IE we should not override standard storage functions because IE does it incorrectly - all values that set as
        # storage properties (e.g. 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 年以来一直存在)。

我的 localStorage 返回未定义,我不知道为什么 - 直到我意识到这是因为我直接从我的计算机(file:///C:/Users/.. .) 当我从服务器/本地主机访问页面时,它确实定义了 localStorage 并且可以正常工作。

除了这里已经很好的答案之外,我还想补充一点。 就我而言,Windows %LOCALAPPDATA% 目录结构上的 NTFS 权限以某种方式被破坏。

诊断此问题。 我创建了一个新的 Windows 帐户(配置文件),它与 localStorage 一起工作得很好,所以我煞费苦心地遍历了各自的 %LOCALAPPDATA%\\Microsoft\\Internet Explorer 树以寻找差异。

我发现了这个宝石:

C:\Users\User\AppData\Local\Microsoft>icacls "Internet Explorer"
Internet Explorer Everyone:(F)

我不知道权限是如何设置的!

更糟糕的是,所有子目录都关闭了所有权限。 难怪 DOMStore 无法访问!

另一个帐户的工作权限是:

 NT AUTHORITY\SYSTEM:(OI)(CI)(F)
 BUILTIN\Administrators:(OI)(CI)(F)
 my-pc\test:(OI)(CI)(F)

这与父目录的权限匹配。

因此,出于懒惰,我通过让所有目录“Internet Explorer”并在继承权限下解决了这个问题。 正确的做法是手动应用每个权限,而不是依赖于继承功能。 但是,如果您遇到此问题,需要检查 %LOCALAPPDATA%\\Microsoft\\Internet Explorer 的 NTFS 权限。 如果 DOMStore 的权限被破坏,所有访问 localStorage 的尝试都会遇到拒绝访问的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM