在localStorage中存储变量太慢了

Str*_*uct 7 html javascript jquery html5 jquery-mobile

我有两个jQuery移动页面(#list和#show).#list页面上有几个具有不同ID的项目.如果我点击第5项,ID no5将存储在localStorage中,我将被重定向到第#show页

现在的问题是:在localStorage中存储ID工作,但是下一页显示的不是5号项目,但它显示了一个旧项目,之前在localStorage中.

来自页面#list的脚本

localStorage.setItem("garageID", $(this).attr('id'));                           
window.location.replace("#show");
Run Code Online (Sandbox Code Playgroud)

Den*_*ret 10

我也遇到了这个问题(而不是在移动设备上:在Chromium/linux上).

由于似乎没有基于回调的API,我使用超时"修复"它,以防止在setItem操作完成之前关闭页面:

localStorage.setItem(name, value);                           
setTimeout(function(){
     // change location
}, 50);
Run Code Online (Sandbox Code Playgroud)

超时0可能就足够了,但由于我没有找到任何规范(可能是在bug的范围内)并且问题没有得到一致的再现,我没有采取任何机会.如果你想要你可以在一个循环测试:

function setLocalStorageAndLeave(name, value, newLocation){
    value = value.toString(); // to prevent infinite loops
    localStorage.setItem(name, value);
    (function one(){
         if (localStorage.getItem(name) === value) {
            window.location = newLocation;
         } else {
            setTimeout(one, 30);
         }
    })();
}
Run Code Online (Sandbox Code Playgroud)

但我不知道localStorage.getItem返回正确值的事实如何保证它真的以永久方式编写,因为没有可中断行为的规范,我不知道规范的以下部分是否可以合法地解释为含义允许浏览器忘记在磁盘离开页面时转储到磁盘上:

该规范不要求上述方法等待数据物理写入磁盘.只需要访问相同的键/值对列表中的不同脚本的一致性.

在您的确切情况下,解决方案可能只是滚动到具有该给定名称的元素以避免更改页面.

关于假定的bug的注意事项:

因为我发现很难再现,所以我没有找到也没有填写任何错误报告.在我在Chromium/linux上观察到的情况下,它发生在delete操作上.

  • [我没有看到任何暗示`localStorage.setItem()`是异步的.](http://www.w3.org/TR/webstorage/#dom-storage-setitem)这种行为可能是一个浏览器错误吗? (4认同)
  • @MichaelKunst测试不能保证任何东西:本地版本的localStorage可能会更新,但硬件存储不会. (2认同)