[英]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
对象似乎“损坏/损坏”?
这不仅仅是 IE11 的错。
可能WEINRE被注入到页面中。 它挂钩到几个系统函数中以提供开发者工具功能,但 IE11 错误地解释了对localStorage
和sessionStorage
属性的分配,并将挂钩函数转换为字符串,就好像它们是将要存储的数据一样。
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.