我正在构建一个系统,该系统将在公司环境中用作用户的主要工作环境。我们希望能够为某些功能打开第二个浏览器窗口并让两个窗口进行通信(例如,在一个窗口上浏览映射界面,选择一个对象并在另一个窗口的编辑器中打开它)。我有两个选择:
1)尝试实现一些JSNI方法来获取Window上的句柄并以此方式进行通信。
2) 实现一个长轮询服务器,通过 cookie 通过共享会话传递事件
关于如何实现选项 1,是否有任何示例或建议?我正在使用 GWT 和 GXT。
或者,您对如何实现多浏览器通信有其他建议吗?
看看GWT 活动和地点。我认为这应该是你的解决方案
我通过 JMS 服务器使用 websockets 进行浏览器到浏览器的通信以进行广播。设置中继服务器相对简单。
如果您可以将有效负载编码为加载到其他窗口位置的 URL,则位置可能是解决方案。
回复:空GwtEvent
从javadoc:
所有 GWT 事件都被认为是死的,一旦最初触发事件的 HandlerManager 完成,就不应再访问它。也就是说,不要保留处理程序方法之外的事件对象。
或许您应该按照关于 javascript 覆盖类型的此博客条目将您的 GwtEvent 复制到 JavaScriptObject 中,然后再进一步转发它。
感谢您的建议。我们计划重新审视我们的导航机制,活动和地点看起来像是一种非常整洁的做事方式。现在,我们通过针对 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);
}
我最终使用 google AutoBean 来同步和取消同步事件以通过 JSNI 发送。一切都很好。此外,为了与子窗口进行通信,我必须创建一个新的 Native 方法来替换 GWT 的 Window.open 方法,以便它返回对新窗口的引用。javascript 函数返回对新窗口的引用,但由于某种原因,GWT 的包装器返回 void。