2013-04-08 20 views
1

我正在构建一个系统,作为用户的主要工作环境在企业环境中使用。我们希望能够为特定功能打开第二个浏览器窗口,并让2个窗口通信(例如,浏览一个映射界面,选择一个对象并在另一个窗口的编辑器中打开它)。 我有两个选项,我可以拿出:与GWT或GXT的多浏览器窗口通信

1)试图实现一些JSNI方法来获得窗口上的句柄,并以这种方式进行通信。

2)实现长轮询服务器通过cookie

传递与共享会话事件是否有关于如何去实现选项1任何实例或建议?我正在使用GWT和GXT。

或者,您有关于如何实现多个浏览器通信的另一个建议?

回答

0

感谢您的建议。我们计划重新审视我们的导航机制,“活动与地点”看起来像是一种非常整洁的做事方式。现在,我们通过针对EventBus触发的事件进行导航,该事件总线由Navigation类侦听并相应地指导导航。

我已经通过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); 
} 

我结束了使用谷歌AutoBean同步和desynchronise通过JSNI发送的事件。所有的作品很好。另外,为了回到子窗口的通信,我必须创建一个新的Native方法来替换GWT的Window.open方法,以便它返回对新窗口的引用。 javascript函数返回对新窗口的引用,但由于某种原因,GWT的包装器返回void。

0

我做浏览器使用websockets通过JMS服务器进行广播的浏览器通信。建立中继服务器相对简单。

如果您可以将您的有效载荷编码到加载到其他窗口位置的URL中,那么位置可能是解决方案。

重:空GwtEvent

javadoc

所有GWT事件被认为是死,不应再被访问 一旦最初发射与 它的活动结束HandlerManager。也就是说,不要拘泥于您的处理程序 方法之外的事件对象。

也许你应该在JavaScript中重载类型之前将你的GwtEvent复制到JavaScriptObject中,按照this blog entry进一步中继。