与GWT或GXT的多浏览器窗口通信

时间:2013-04-08 06:33:23

标签: gwt gxt jsni

我正在构建一个将在企业环境中用作用户主要工作环境的系统。我们希望能够打开第二个浏览器窗口以获得某些功能,并让2个窗口进行通信(例如,浏览一个映射界面,选择一个对象并在另一个窗口的编辑器中打开它)。 我有两个选项,我可以提出:

1)尝试实现一些JSNI方法来获取Window上的句柄并以这种方式进行通信。

2)实现长轮询服务器以通过cookie传递具有共享会话的事件

是否有关于如何实现选项1的任何示例或建议?我正在使用GWT和GXT。

或者,您对如何实现多个浏览器通信有其他建议吗?

3 个答案:

答案 0 :(得分:0)

看看GWT Activities and Places。我认为这应该是你的解决方案

答案 1 :(得分:0)

我通过JMS服务器使用websockets进行浏览器浏览器通信以进行广播。设置中继服务器相对简单。

如果您可以将有效负载编码为加载到其他窗口位置的网址,则可能是解决方案。

re:null GwtEvent

来自javadoc

  

所有GWT事件都被视为已死亡,不应再被访问   一旦最初解雇事件的HandlerManager完成   它。也就是说,不要坚持处理程序之外的事件对象   方法

也许你应该在javascript覆盖类型上按照this blog entry将GwtEvent复制到JavaScriptObject中,然后再进一步转发它。

答案 2 :(得分:0)

感谢您的建议。我们计划重新审视我们的导航机制,“活动和场所”看起来像是一种非常整洁的做事方式。目前,我们通过针对EventBus触发的事件进行导航,导航类会监听并相应地指导导航。

我通过JSNI进行了沟通。但是,我有一个恼人的问题。新窗口拨打电话:

public native void fireCrossBrowserEvent(GwtEvent<?> event) /*-{
    $wnd.opener.fireCrossBrowserEvent(event);
}-*/;

在主窗口中调用此方法:

$wnd.fireCrossBrowserEvent = $entry(function(event) {
    $wnd.alert("fireCrossBrowserEvent: " + event);
    @my.application.client.event.EventBus::fireEvent(Lcom/google/gwt/event/shared/GwtEvent;)(event);
});

调用:

public static void fireEvent(GwtEvent<?> event) {
    System.out.println("fireEvent: " + event);
    bus.fireEvent(event);
}

我最终使用google AutoBean来同步和取消同步事件,以便通过JSNI发送。一切都很好。此外,为了回传到子窗口,我不得不创建一个新的Native方法来替换GWT的Window.open方法,以便它返回对新窗口的引用。 javascript函数返回对新窗口的引用,但由于某种原因,GWT的包装器返回void。