【问题标题】:Storage event not firing存储事件未触发
【发布时间】:2016-06-22 06:52:41
【问题描述】:

附加事件:

$(window).on("storage", function (e) {
   //callback not getting hit
});

试图触发事件:

localStorage.setItem("test", "123");

我打开了两个选项卡,都在监听存储事件。我可以看到 localStorage 在两个选项卡上都得到了正确更新。但是,当我在一个选项卡上更改 localStorage 时,另一个选项卡永远不会触发该事件。有什么想法吗?

在 Chrome/Firefox 上试过。域名格式为https://www.xxx.yyy.zzz

【问题讨论】:

    标签: javascript local-storage dom-events


    【解决方案1】:

    StorageEvent 在具有相同域的不同页面中触发。

    来自 MDN

    只要对 Storage 对象进行更改,就会触发 StorageEvent。

    这不适用于进行更改的同一页面 - 它实际上是域上其他页面使用存储同步所做更改的一种方式。

    【讨论】:

      【解决方案2】:

      正如其他人在答案中指出的那样,storage 事件只有在 localStorage 在另一个浏览器的选项卡/窗口(同一应用程序)中发生更改时才会被(由侦听器)拾取,但是不在当前标签的上下文中。

      检测当前选项卡中的存储变化

      window.addEventListener('storage', console.log)
      
      window.localStorage.setItem('test', '123')
      window.dispatchEvent( new Event('storage') ) // <----- 
      

      已调度手动storage 事件。

      这将有效地触发storage 事件侦听器两次 在其他选项卡/窗口(同一个应用程序)上,但在某些情况下这应该不是问题。

      【讨论】:

        【解决方案3】:

        如果甚至在不同的选项卡/页面之间进行测试,但仍然没有看到该事件...我发现只有在密钥已经存在时才会触发该事件。

        看起来更像是onchange 事件。

        localStorage键设置一个默认值,如果连undefined再测试。

        我认为这是一个 Chrome 错误,因为 Firefox 和 Safari 可以正确触发,但它就是这样。

        【讨论】:

          【解决方案4】:

          问题是由代码中的document.domain 覆盖引起的。删除 document.domain 设置器后,事件正常工作。

          似乎这是由 Chrome 中的错误引起的。

          https://bugs.chromium.org/p/chromium/issues/detail?id=136356&q=label%3AOWP-Standards-Compatibility&colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Cr%20Status%20Owner%20Summary%20OS%20Modified

          【讨论】:

          • After I removed the offending line, events worked correctly. 你删除了哪一行?
          • 我改写了答案,现在更清楚了吗?我在主机abc.xyz.com 的页面上有document.domain = xyz.com
          【解决方案5】:
          window.addEventListener('storage', function (e) {
                console.log("storage event occured here");
          },false);
          

          Storage Listner 在源选项卡以外的其他选项卡中被调用。只需将调试器添加到其他选项卡即可。

          【讨论】:

            【解决方案6】:

            只要键值发生更改,例如由 set 或 remove 方法进行的更改,您始终可以使用localDataStorage 之类的实用程序在同一窗口/选项卡中为您触发事件。您还可以使用它来透明地设置/获取以下任何“类型”:Array、Boolean、Date、Float、Integer、Null、Object 或 String。

            [DISCLAIMER] 我是该实用程序的作者 [/DISCLAIMER]

            实例化该实用程序后,以下 sn-p 将允许您监视事件:

            function localStorageChangeEvents( e ) {
                console.log(
                    "timestamp: "     + e.detail.timestamp + " (" + new Date( e.detail.timestamp ) + ")" + "\n" +
                    "key: "           + e.detail.key     + "\n" +
                    "old value: "     + e.detail.oldval  + "\n" +
                    "new value: "     + e.detail.newval  + "\n"
                );
            };
            document.addEventListener(
                "localDataStorage"
                , localStorageChangeEvents
                , false
            );
            

            【讨论】:

            • 这太难读了。您能否在该仓库中也发布原始源代码?我其实很好奇你的逻辑是什么。
            • 点了,你是对的。我已经用源文件更新了 repo。 ?
            猜你喜欢
            • 2020-11-11
            • 1970-01-01
            • 2018-04-13
            • 1970-01-01
            • 2021-12-29
            • 1970-01-01
            • 2018-10-21
            • 1970-01-01
            • 2020-07-14
            相关资源
            最近更新 更多