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 将分配给 localStorage
和 sessionStorage
属性的赋值解释错误,并将挂钩函数转换为字符串,就好像它们是要存储的数据一样。
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对象#js #localstorage
javascript localStorage对象#js #localstorage