我正在构建一个将在企业环境中用作用户主要工作环境的系统。我们希望能够打开第二个浏览器窗口以获得某些功能,并让2个窗口进行通信(例如,浏览一个映射界面,选择一个对象并在另一个窗口的编辑器中打开它)。 我有两个选项,我可以提出:
1)尝试实现一些JSNI方法来获取Window上的句柄并以这种方式进行通信。
2)实现长轮询服务器以通过cookie传递具有共享会话的事件
是否有关于如何实现选项1的任何示例或建议?我正在使用GWT和GXT。
或者,您对如何实现多个浏览器通信有其他建议吗?
答案 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。