3

嗨,我有以下代码:

    button.addClickHandler( new ClickHandler( ) {
        @Override   
        public void onClick( ClickEvent event ) {    
             Call 1 --> Window.open( publicBookingUrl, "_blank", null );                
            dispatcher.execute( new HasServicesAction(true), 
                    new ActionCallback<SomeResult>( ){       
                @Override 
                public void onSuccess( SomeResult result ) {
             Call 2 --> Window.open( publicBookingUrl, "_blank", null );
                } 
            });  
        }        
    });

In Call 1 弹出窗口阻止程序不会阻止弹出窗口打开。它成功地在新选项卡或新窗口中打开一个窗口。然而,在 Call2 中,弹出窗口阻止程序会阻止弹出窗口,因此用户必须明确启用弹出窗口。我找到了一篇解释其背后原因的帖子:https ://groups.google.com/forum/?fromgroups=#!topic/google-web-toolkit/V0s7goJxuhc 不幸的是,这个解决方案对我不起作用。

有谁知道为什么会这样?我们怎样才能解决这个问题?

提前致谢。

4

2 回答 2

5

正如您链接到的页面所表明的那样,窗口只能作为直接用户操作的结果打开。您可以通过在 RPC 调用之前打开窗口并在 RPC 调用返回后设置窗口的 URL 来解决此问题。GWT 的内置Window不会公开所有底层window对象的属性,因此需要自定义实现:

public class MyWindow extends JavaScriptObject {
  // All types that extend JavaScriptObject must have a protected,
  // no-args constructor. 
  protected MyWindow() {}

  public static native MyWindow open(String url, String target, String options) /*-{
    return $wnd.open(url, target, options);
  }-*/;

  public native void close() /*-{
    this.close();
  }-*/;

  public native void setUrl(String url) /*-{
    if (this.location) {
      this.location = url;
    }
  }-*/;
}

然后在您的点击处理程序中:

public void onClick(ClickEvent event) {
  final MyWindow window = MyWindow.open(null, "_blank", null);

  dispatcher.execute(new HasServicesAction(true), 
      new ActionCallback<SomeResult>( ){       
        @Override 
        public void onSuccess(SomeResult result) {
          if (result.isGood()) {
            window.setUrl(publicBookingUrl);
          } else {
            window.close();
          }
        }
      });  
}

请注意,如果您的调用setUrl()更改了打开窗口的来源,您将无法修改任何属性或调用任何函数。

于 2012-11-07T23:42:42.713 回答
-2

摆脱窗口弹出窗口。请改用 PopupDialog。

如果用户禁用了弹出窗口并且您找到了显示它的方法,那么该用户会怎么想您?

于 2012-11-07T23:46:00.160 回答