GWT: открыть окно После того, как RPC будет предотвращен блокировщиком всплывающих окон
Привет у меня есть следующий код:
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 );
}
});
}
});
В вызове 1 popup blocker не блокирует всплывающее окно от открытия. Он успешно открывает окно в новой вкладке или в новом окне. В Call2, однако, popup blocker предотвратит всплывающее окно, поэтому пользователь должен явно включить всплывающее окно.
Я нашел сообщение, объясняющее причины этого: https://groups.google.com/forum/?fromgroups=#! topic / google-web-toolkit/V0s7goJxuhc
К сожалению, это решение не работает для меня.
Кто-нибудь знает почему так происходит? Как мы можем обойти это?
Заранее благодарю.
2 ответов:
Как указано на странице, на которую вы ссылаетесь, окна могут быть открыты только в результате прямого действия пользователя. Вы можете обойти это, открыв окно перед вызовом RPC и установив URL-адрес окна после возврата вызова RPC. Встроенный в 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()изменяет Начало открывшееся окно вы не сможете изменить какие-либо свойства или вызвать какие-либо функции после этого.
Избавьтесь от всплывающих окон. Вместо этого используйте PopupDialog.
Если пользователь отключил всплывающие окна, и вы нашли способ показать его, что этот пользователь подумает о вас?
Comments