Internet Explorer 11中的localStorage
对象(Windows 7版本)包含某些函数的字符串表示,而不是您期望的本机调用。
这只会破坏vanilla JavaScript和JSFiddle等网站对此代码没有任何问题,但我怀疑是因为有localStorage
个polyfill可以纠正它。
以此HTML页面代码为例:
<!DOCTYPE html>
<script>
localStorage.setItem('test', '12345');
alert(localStorage.getItem('test'));
localStorage.clear();
</script>
除了IE11之外,我在所有已安装的浏览器中都能很好地工作。第一行' SCRIPT5002:预期的功能 '发生错误。
看一下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
对象似乎“已损坏/损坏”?
答案 0 :(得分:25)
原来这是Windows 7 SP1的基本版IE11(11.0.9600.16428)中的一个问题。
在installing a patch更新到11.0.9600.16476(更新版本11.0.2 - KB2898785)后,问题得到解决。可以在patch download page的底部找到指向其他Windows版本(32位等)的链接。
答案 1 :(得分:4)
这不仅仅是IE11的错误。
可能会在页面中注入WEINRE。它hooks into several system functions to provide Developer Tools functionality,但IE11解释了localStorage
和sessionStorage
属性的赋值错误,并将钩子函数转换为字符串,就好像它们是要存储的数据一样。“ p>
有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)。
答案 2 :(得分:2)
我的localStorage返回undefined并且我无法找出原因 - 直到我意识到它是因为我直接从我的计算机运行HTML页面(带有localStorage脚本)(文件: /// C:/用户/ ...)。当我从服务器/ localhost访问页面时,它确实定义并运行了localStorage。
答案 3 :(得分:1)
除了这里已经非常好的答案外,我还要补充一点。就我而言,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的尝试都将被拒绝访问。