Gwt localStorageEvent - 交叉标签通信

时间:2016-07-23 10:19:51

标签: java gwt local-storage session-storage

我想进行交叉标签交流。在那我想使用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本地jetty服务器编译所有内容并使用super dev模式。

2 个答案:

答案 0 :(得分: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匿名函数来调用Handler。它完全绕过整个Storage GWT机制。

答案 1 :(得分:0)

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

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

我不依赖于此处的事件,但使用TimerscheduleRepeating每隔3秒定期检查一次本地存储。

每个标签都需要一个不同的ID,您可以生成该ID使用Random。 如果我想发信号,我在本地storage设置了一个条目。 此条目的键是信号名称,值是设置信号的选项卡的ID。

因此,当执行Timer时,我会检查带有信号名称的条目。如果我找到一个,我检查的值是否与当前标签的ID不同,因为我不想通知信令标签它自己的事件。

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

毕竟它并不完美,因为总是Timer每隔3秒运行一次,信号标签也可能需要3秒钟来接收信号。然而,这是我在不同标签之间获得可靠信号的唯一途径。