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
К сожалению, это решение не работает для меня.



Кто-нибудь знает почему так происходит? Как мы можем обойти это?



Заранее благодарю.

520   2  

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

    Ничего не найдено.