Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript GWT:弹出阻止程序阻止RPC后打开窗口_Javascript_Gwt_Window - Fatal编程技术网

Javascript GWT:弹出阻止程序阻止RPC后打开窗口

Javascript GWT:弹出阻止程序阻止RPC后打开窗口,javascript,gwt,window,Javascript,Gwt,Window,嗨,我有以下代码: button.addClickHandler( new ClickHandler( ) { @Override public void onClick( ClickEvent event ) { Call 1 --> Window.open( publicBookingUrl, "_blank", null ); dispatcher.

嗨,我有以下代码:

    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 );
                } 
            });  
        }        
    });
按钮。添加ClickHandler(新的ClickHandler(){
@凌驾
单击公共void onClick(单击事件){
调用1-->窗口。打开(publicBookingUrl,“_blank”,null);
dispatcher.execute(新的HasServicesAction(true)),
新建ActionCallback(){
@凌驾
成功时公共无效(SomeResult结果){
调用2-->窗口。打开(publicBookingUrl,“_blank”,null);
} 
});  
}        
});
在调用1中,弹出窗口拦截器不会阻止弹出窗口打开。它成功地在新选项卡或新窗口中打开窗口。然而,在Call2中,弹出阻止程序将阻止弹出,所以用户必须显式启用弹出。 我找到一篇文章解释了这背后的原因: 不幸的是,这个解决方案不适合我

有人知道为什么会这样吗?我们怎样才能避开这个问题


提前谢谢

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

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();
          }
        }
      });  
}
public void onClick(单击事件){
最终MyWindow窗口=MyWindow.open(空,“_blank”,空);
dispatcher.execute(新的HasServicesAction(true)),
新建ActionCallback(){
@凌驾
成功时公共无效(SomeResult结果){
if(result.isGood()){
setUrl(publicBookingUrl);
}否则{
window.close();
}
}
});  
}

请注意,如果对
setUrl()
的调用更改了已打开窗口的属性,则以后将无法修改任何属性或调用任何函数。

清除窗口弹出窗口。改用弹出对话框


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

问题是我可能不需要弹出窗口,因此此解决方案对我不起作用。条件由RPC返回的结果决定。您可以向
MyWindow
类添加
close()
方法来处理此问题-我将更新我的答案。太好了!需要将final添加到MyWindow类中,如果没有,我会得到一些关于JavaScriptObject子类的错误,必须是final。
窗口有合法的用途。open
。可能是。但是如果用户阻止了弹出窗口,你就不能“合法”绕过它。如果您因任何原因无法使用弹出对话框,请告诉他们为您的网站启用弹出窗口。例如:尝试在弹出对话框中显示PDF(或实际上提供下载)。对于您的解决方案,我如何知道弹出窗口阻止程序是否处于活动状态(以告诉用户禁用它)?@PaŭloEbermann我确实通过打开一个新选项卡在我的一个应用程序中提供PDF下载。不同之处在于,当用户启动该操作(即,用户单击下载按钮或图标)时,浏览器允许该操作。当您尝试在没有用户操作的情况下以编程方式打开新选项卡时,浏览器会阻止它。是的。。。我们刚刚更改了应用程序的行为,因此按钮单击会首先执行GWT-RPC调用,并在返回时加载PDF(以便在出现问题时向用户提供一些反馈)。它并不是完全没有用户操作,但我想浏览器没有看到区别。现在的解决办法是告诉用户(通过邮件)允许它,但我想从我的应用程序中检查它。或者我试试杰森的解决方案。