【问题标题】:Multiple Browser Window Communication with GWT or GXT与 GWT 或 GXT 的多个浏览器窗口通信
【发布时间】:2013-04-08 06:33:23
【问题描述】:

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

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

2) 实现一个长轮询服务器,通过 cookie 通过共享会话传递事件

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

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

【问题讨论】:

    标签: gwt gxt jsni


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我通过 JMS 服务器使用 websockets 进行浏览器到浏览器的通信以进行广播。搭建中继服务器比较简单。

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

      re: null GwtEvent

      来自javadoc

      所有 GWT 事件都被视为已死,不应再访问 一旦最初触发事件的 HandlerManager 以 它。也就是说,不要保留处理程序之外的事件对象 方法。

      也许您应该在进一步转发之前将 GwtEvent 复制到 JavaScript 覆盖类型上的 this blog entry 中。

      【讨论】:

        【解决方案3】:

        感谢您的建议。我们计划重新审视我们的导航机制,活动和地点看起来像是一种非常整洁的做事方式。目前,我们通过针对 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。

        【讨论】:

          猜你喜欢
          • 2013-10-21
          • 2017-03-08
          • 2022-08-17
          • 2013-05-03
          • 2017-08-18
          • 1970-01-01
          • 1970-01-01
          • 2010-11-02
          • 2016-07-14
          相关资源
          最近更新 更多