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

Posted

技术标签:

【中文标题】JavaScript localStorage 对象在 Windows 7 上的 IE11 中损坏【英文标题】:JavaScript localStorage object broken in IE11 on Windows 7 【发布时间】:2014-02-04 23:13:27 【问题描述】:

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' 出现错误。

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

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

【问题讨论】:

其实是localStorage is supported by IE 8. 【参考方案1】:

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

在installing a patch 更新到 11.0.9600.16476(更新版本 11.0.2 - KB2898785)后问题得到解决。可以在patch download page 底部找到其他版本的 Windows(32 位等)的链接。

【讨论】:

如果有人在安装此修复程序后仍然存在此错误,您可能需要尝试以下操作: 虽然我已经在版本 11.0.9600.16476 上出现了这个问题,但直到我清除了网站数据。此问题可能与应用程序缓存(html 清单)或旧的 LocalStorage 条目有关。 我在 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; 我在 Windows Mobile 10 模拟器、Edge 浏览器中看到了这个! Edge/12.0 根据用户代理。【参考方案2】:

不只是 IE11 的错。

可能WEINRE 被注入到页面中。 hooks into several system functions to provide Developer Tools functionality,但 IE11 将分配给 localStoragesessionStorage 属性的赋值解释错误,并将挂钩函数转换为字符串,就好像它们是要存储的数据一样。

a comment in the 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,要么此更改尚未正式发布 (it's been there since 2013)。

【讨论】:

WEINRE 链接已失效:people.apache.org/~pmuellr/weinre-docs/latest【参考方案3】:

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

【讨论】:

【参考方案4】:

除了这里已经很出色的答案,我想补充一点。就我而言,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 的尝试都将被拒绝访问。

【讨论】:

以上是关于JavaScript localStorage 对象在 Windows 7 上的 IE11 中损坏的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript]localStorage对象

javascript localStorage对象#js #localstorage

javascript localStorage对象#js #localstorage

localstorage

javaScript --- localStorage 本地存储

HTML5 localStorage 有用的函数 // JavaScript,TypeScript [关闭]