【问题标题】:Gwt localStorageEvent - cross tab communicationGwt localStorageEvent - 跨表通信
【发布时间】:2016-11-27 04:42:59
【问题描述】:

我想进行跨表通信。我想使用 localStorage / sessionStorage。

Class1 包含这部分代码:

Storage stockStore = Storage.getLocalStorageIfSupported();
if (stockStore != null) {
    stockStore.setItem("newLoad", "123");
}

Class2 包含这部分代码:

Storage stockStore = Storage.getLocalStorageIfSupported();
    if (stockStore != null) {
          stockStore.addStorageEventHandler(new StorageEvent.Handler() {
          public void onStorageChange(StorageEvent event) {
            Log.println("Heureka!");
          }
        });
    }

当用户按下按钮时调用第一类代码。

因此,当用户打开两个选项卡并按下按钮(在选项卡 1 内)时,它将调用 class1 中的代码。然后触发事件并写入“Herueka”,但仅在他的实际选项卡(选项卡 1)中。 它应该写在两个选项卡(选项卡 1 和选项卡 2)中。所以这是行不通的。

标签1的网址:http://127.0.0.1:8888/#loads

标签2的网址:http://127.0.0.1:8888/index.html#lights

标签具有相同的会话,我正在使用 FF 47 进行测试。 一切都是通过eclipse本地码头服务器编译的,并使用超级开发模式。

【问题讨论】:

    标签: java gwt local-storage session-storage


    【解决方案1】:

    自上一个回答后找到了一种解决方法:https://github.com/gwtproject/gwt/issues/9205(我没试过)

    也就是说,我已经确认以下工作:

    private static native void addTrueStorageHandler(Handler h) /*-{
        $wnd.addEventListener('storage', function(e) {
             h.@com.google.gwt.storage.client.StorageEvent.Handler::onStorageChange(Lco    m/google/gwt/storage/client/StorageEvent;)(e);
        });
    }-*/;
    

    应该调用上面的函数来注册Handler。这只是创建一个javascript匿名函数来调用处理程序。它完全绕过了整个Storage GWT 机制。

    【讨论】:

      【解决方案2】:

      我可以确认,我在尝试利用本地存储上的事件时遇到了同样的问题。 不幸的是,存储事件似乎不适用于跨选项卡。 至少我无法让它们可靠地触发所有选项卡,并且我还需要从事件中排除当前选项卡(此选项卡触发它并且不需要通知)。

      我所做的解决方法是创建一个类,该类使用本地存储处理信号。 这是相当多的代码,与内部项目相关,但我将尝试概述它是如何完成的以帮助您入门。

      我不依赖这里的事件,而是使用TimerscheduleRepeating 每3 秒定期检查一次本地存储。

      每个选项卡都需要一个不同的 ID,您可以生成它,例如使用Random。 如果我想发出信号,我会在本地 storage 中设置一个条目。 该条目的key是信号名称,value是设置信号的选项卡的id。

      所以当Timer 被执行时,我会检查一个带有信号名称的条目。如果找到一个,我会检查该值是否与当前选项卡的 id 不同,因为我不想通知信号选项卡自己的事件。

      您只需要记住在应用程序关闭时或在合理的时间后从本地存储中删除该条目。否则,您可能会在重新启动应用程序时遇到旧条目并再次执行信号处理程序。

      毕竟它并不完美,因为总是有 Timer 每 3 秒运行一次,并且发出信号的选项卡也可能需要长达 3 秒才能接收到信号。然而,这是我在不同标签之间获得可靠信号的唯一方法。

      【讨论】:

      • 感谢您的回答。我将实施此解决方法,但请保持问题开放,因为这不是此问题的 100% 解决方案。
      猜你喜欢
      • 1970-01-01
      • 2010-11-26
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多