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

IT技术 javascript html windows-7 local-storage internet-explorer-11
2021-02-11 19:11:04

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

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

以这个 HTML 页面代码为例:

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

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

查看setItemIE 开发人员工具控制台中函数实际上是什么类型,指出它是一个字符串......?

    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对象似乎“损坏/损坏”?

4个回答

原来这是 Windows 7 SP1 的 IE11 (11.0.9600.16428) 基本版本中的一个问题。

安装补丁来更新11.0.9600.16476(更新版11.0.2 - KB2898785)问题得到解决。可以在补丁下载页面底部找到指向其他 Windows 版本(32 位等)的链接

我在带有 IE 11.0.9600.16661 的 Windows 8.1 x64 上遇到了同样的问题。但接下来的系统/浏览器工作完美:+ Windows 7 SP1 IE 10.0.9200.16866;+ Windows 7 SP1 IE 11.0.9600.16428;+ Windows 7 SP1 IE 11.0.9600.17239;+ Windows 8.1 x64 IE 11.0.9600.17126;+ Windows 8.1 x64 IE 11.0.9600.17239;
2021-03-19 19:11:04
我在 Windows Mobile 10 模拟器、Edge 浏览器中看到了这个!Edge/12.0 根据用户代理。
2021-03-20 19:11:04
如果有人在安装修补程序后仍然存在此错误,您可能想尝试以下操作: 这个问题出现在我身上,尽管我已经使用了 11.0.9600.16476 版本,直到我清除了网站数据。此问题可能与应用程序缓存(html 清单)或旧的 LocalStorage 条目有关。
2021-04-07 19:11:04

这不仅仅是 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 年以来一直存在)。

2021-03-20 19:11:04

我的 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 的尝试都会遇到拒绝访问的情况。