Javascript win8.1 IE11中的本地存储不同步

Javascript win8.1 IE11中的本地存储不同步,javascript,html,internet-explorer,local-storage,internet-explorer-11,Javascript,Html,Internet Explorer,Local Storage,Internet Explorer 11,我们有两页“/读”和“/写”。Page“/write”每秒用当前时间更新本地存储: setInterval(function(){ var time = (new Date()).getTime(); localStorage.setItem("time", time); console.log("set", time); },1000); 页面“/read”读取相同的存储: setInterval(function(){ var time = localSto

我们有两页“/读”和“/写”。Page“/write”每秒用当前时间更新本地存储:

setInterval(function(){
    var time = (new Date()).getTime();
    localStorage.setItem("time", time);
    console.log("set", time);
},1000);
页面“/read”读取相同的存储:

setInterval(function(){
    var time = localStorage.getItem("time");
    console.log("get", time);
},1000);
有人会认为“/read”页面应该显示由另一个页面写入本地存储的相同值。但在Win8.1上的IE11中,这是不正确的。页面“/read”从存储中读取一些旧值,然后它将向您显示相同的值(就好像它使用缓存进行本地存储一样)。有什么想法吗


另外,两个页面都在同一个域上(实例-

与其说是答案,不如说是进一步调查。使用下面的页面,可以通过在web服务器上托管并在不同的选项卡中打开来轻松测试此问题。然后单击其中一个选项卡中的按钮

<!DOCTYPE html>
<head>
    <title>LocalStorage Test</title>
</head>
<body>
<button onclick="setLocalStorageValue()">Set Time</button>

<script>
    setInterval(function () {
        console.log(window.localStorage.getItem("test_key"));
    }, 1000);

    function setLocalStorageValue () {
        window.localStorage.setItem("test_key", new Date().getTime());
    }
</script>
</body>
</html>

本地存储测试
设定时间
setInterval(函数(){
log(window.localStorage.getItem(“test_key”);
}, 1000);
函数setLocalStorageValue(){
setItem(“test_key”,new Date().getTime());
}
无论操作系统如何,Chrome/Firefox/Safari中的结果都是相同的。 它们表明本地存储在来自同一来源的页面之间共享

在Windows7上的IE11上,也给出了相同的结果。

根据我所读到的,这似乎符合规范第3点

但是…

  • windows 8.1上的IE 11将演示同一来源的单独本地存储区域。

  • Windows 10(10162)上的Microsoft Edge也存在同样的问题。 IE11在Windows7上表现出“正确”的行为,这表明操作系统是问题所在


IE11/Windows 8下的localStorage.GetItem方法似乎不可靠,可能会检索以前的值。但这可以通过在检索值之前立即调用localStorage.SetItem方法来解决

我设法用muttonUp的代码复制了这个问题,然后做了以下更改,以使两个窗口相互对话:

<!DOCTYPE html>
<head>
    <title>LocalStorage Test</title>
</head>
<body>
<button onclick="setLocalStorageValue()">Set Time</button>

<script>
    setInterval(function () {
        window.localStorage.setItem("unused_key",null);
        console.log(window.localStorage.getItem("test_key"));
    }, 1000);

    function setLocalStorageValue () {
        console.log("Button clicked - setting time");
        window.localStorage.setItem("test_key", new Date().getTime());
    }
</script>
</body>
</html>

本地存储测试
设定时间
setInterval(函数(){
setItem(“未使用的_键”,null);
log(window.localStorage.getItem(“test_key”);
}, 1000);
函数setLocalStorageValue(){
日志(“点击按钮-设置时间”);
setItem(“test_key”,new Date().getTime());
}
以下是输出:


这种变通方法在我的场景中很有用,因为我只是偶尔从本地存储中检索值,并且只存储少量数据。由于setItem方法调用数量的增加可能会带来性能开销,在使用此解决方案之前,我可能会仔细考虑本地存储的流量更大。

我在Win 10上找到了解决此问题的方法。如果在代码中处理window.onstorage事件,则localStorage将刷新所有打开的选项卡。 像这样简单的事情对我很有用:

我还没有彻底测试过这段代码,所以请在任何生产应用程序中使用此方法之前进行测试


希望这有帮助

我的解决方案-角度应用程序:

 @HostListener('window:storage', ['$event'])

 testWindowStorage(event: StorageEvent) {

     if (event.key === 'xxx' && event.newValue !== event.oldValue 
         && event.newValue !== event.oldValue)) {

      //do your business
     }
 }

对我来说效果很好。我已经和IE11核实过了。在Win8.1上,它每秒钟打印更新的value.IE11?我问它是因为在win7中它工作良好我也有同样的问题,在Win8.1的IE9中它也没有按预期工作。请参阅下面我的“答案”。它在Win10Edge上似乎也不起作用。不幸的是,我也调查了这个问题,在两个窗口中使用localStorage.setItem方法成功地更新了localStorage文件(%userprofile%\AppData\Local\Microsoft\internetexplorer\DOMStore\[RandomString]\[Domain].xml),localStorage.getItem方法无法始终从文件中获取最新数据。在8.1\IE11上运行。很好的解决方法!因此IE11必须从底层操作系统请求值,而win7会对每个getItem执行新的查找,而Win8和Win10则不会。或者他们只是在win7和Win8之间更改了IE11的更改部分。。。。。就我个人而言,我希望他们现在已经解决了这个问题。谢谢-您提供了一个很好的例子:-)正在跟踪问题,但(通常!)没有任何即将解决的迹象:这对我不起作用,因为我有一个存储事件,希望读取其他选项卡上的本地存储,如果在处理事件时更改localStorage,则会触发另一个事件,这将是一个无休止的循环:D@behzad您可以在
设置超时(…)
中执行此操作edge v41上存在相同的问题,可以确认这一点并修复该问题。
 @HostListener('window:storage', ['$event'])

 testWindowStorage(event: StorageEvent) {

     if (event.key === 'xxx' && event.newValue !== event.oldValue 
         && event.newValue !== event.oldValue)) {

      //do your business
     }
 }