您好我有以下代码:
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 );
}
});
}
});
在Call 1中,弹出窗口阻止程序不会阻止弹出窗口打开。它在新选项卡或新窗口中成功打开一个窗口。在Call2中,弹出窗口阻止程序会阻止弹出窗口,因此用户必须明确启用弹出窗口。 我发现一篇帖子解释了这背后的原因:https://groups.google.com/forum/?fromgroups=#!topic/google-web-toolkit/V0s7goJxuhc 不幸的是,这个解决方案对我不起作用。
有谁知道为什么会这样?我们怎么能解决这个问题?
提前致谢。
答案 0 :(得分: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()
的调用更改了已打开窗口的origin,您将无法修改任何属性或之后调用任何函数。
答案 1 :(得分:-2)
摆脱窗口弹出窗口。请改用PopupDialog。
如果用户禁用了弹出式窗口并且您找到了显示方式,那么该用户会对您有什么看法?