2010-10-11 3 views
19

Я занимаюсь разработкой приложения GWT и я используюGWT открытая страница в новой вкладке

com.google.gwt.user.client.Window.open(pageUrl, "_blank", ""); 

, чтобы открыть новую страницу. И он открывается на новой вкладке при вызове, например, непосредственно после нажатия кнопки. Но я решил сделать несколько проверок на сервере, прежде чем открывать новую страницу и поставил звонок на указанный выше метод к

public void onSuccess(Object response) { 
} 

И он начинает открывать страницы в новом окне вместо новой вкладки (это только справедливо для Chrome другие браузеры все еще открывают его на новой вкладке).

Может кто-нибудь мне помочь?


Я построил небольшой пример, чтобы проиллюстрировать этот вопрос:

button.addClickHandler(new ClickHandler() { 
     public void onClick(ClickEvent event) { 
      Window.open("http://www.google.com/", "_blank", ""); 
      MySampleApplicationServiceAsync serviceAsync = GWT.create(MySampleApplicationService.class); 
      serviceAsync.getMessage("Hello, Server!", new AsyncCallback() { 

       public void onFailure(Throwable caught) { 
        Window.alert("ERROR"); 
       } 

       public void onSuccess(Object result) { 
        Window.open("http://www.bing.com/", "_blank", ""); 
       } 
      } 
      ); 
     } 
    }); 
  • Firefox (3.6.8) открывает обе страницы в новых вкладках.
  • Chrome (6.0) открывает «google.com» на новой вкладке и «bing.com» в новом окне
  • Opera (10.10) открывается на новых вкладках.
  • IE (8.0) открывается как в новых Windows.

Я пометил ответ igorbel «ы, как единственно правильный, потому что я не нашел правильный способ указать такое же поведение во всех ситуациях.


+1

Этот вопрос был полезен для меня, чтобы узнать, как просто открыть новую вкладку: com.google.gwt.user.client.Window.open (pageUrl, "_blank", ""); – cellepo

ответ

3

Я не уверен, что вы сможете контролировать это так, как хотите. Проблема в том, что браузеры могут решить, когда открывать окна и когда открывать вкладки. Например, firefox имеет возможность: «Вместо этого открывать новые окна на новых вкладках». И не забывайте браузеры, которые не поддерживают вкладки (да, они все еще существуют).

Поскольку это такой проблемный аспект пользовательского опыта, я бы рекомендовал пересмотреть ваш дизайн. Действительно ли важно, чтобы ваше приложение отличалось от открытия новой вкладки и открытия нового окна?

0

Этот код работает для меня:

public static native String getURL(String url)/*-{ 
return $wnd.open(url, 
'target=_blank') 
}-*/; 
2

Интересная вещь, хром откроет страницу в новой вкладке в случае, если вы поставите window.open (...) инструкции в теле реализации обработчика нажмите ,

Например:

Button someButton = new Button("test", 
        new ClickHandler() { 

         public void onClick(ClickEvent event) { 
          Window.open(...); 
         } 

        }); 

И страница будет открыта в отдельном окне в случае, если я буду включать в себя любое Async. запрос по указанному коду:

Button someButton = new Button("test", 
        new ClickHandler() { 

         public void onClick(ClickEvent event) { 
          someService.doSomething(new AsyncCallback() { 
           void onSuccess(Object o) { 
            Window.open(...); 
           } 
           ... 
          }); 

         } 

        }); 
20

Я использовал этот код, и он работает для меня в google chrome и Mozilla firefox 3.6.8 браузеров Если вы хотите, чтобы открыть страницу в новом окне вы должны написать код, как

Window.open("www.google.com","_blank","enabled"); 

Если вы хотите, чтобы открыть страницу в новой вкладке, вы должны написать код, как

Window.open("www.google.com","_blank",""); 
+0

Можете ли вы предоставить дополнительную информацию о третьем параметре? Что это значит и как оно используется? – RAS

+3

@RAS: см. Https://developer.mozilla.org/en/DOM/window.open –

3

Этот код работает for me:

  1. Перед вызовом метода Async сохраните ссылку на новое окно с пустыми параметрами.
  2. В методе onSuccess() задается URL-адрес окна.

Button someButton = new Button("test"); 
SelectionListener<ButtonEvent> listener = new SelectionListener<ButtonEvent>() 
{ 
    public void componentSelected(ButtonEvent ce) 
    { 
     final JavaScriptObject window = newWindow("", "", ""); 

     someService.doSomething(new AsyncCallback() 
     { 
      public void onSuccess(Object o) 
      { 
       setWindowTarget(window, "http://www.google.com/"); 
      } 
     });    
    } 
} 
someButton.addSelectionListener(listener); 


private static native JavaScriptObject newWindow(String url, String name, String features)/*-{ 
    var window = $wnd.open(url, name, features); 
    return window; 
}-*/; 

private static native void setWindowTarget(JavaScriptObject window, String target)/*-{ 
    window.location = target; 
}-*/; 

Найдено в: http://groups.google.com/group/google-web-toolkit/browse_thread/thread/574b3b828271ba17

1

То, как Chrome смотрит на него, вызывая Window.open(), как пытается открыть всплывающее окно в лицо пользователя. Это нахмурилось и вызовет встроенный блокировщик всплывающих окон. Следуя ссылке, в соответствии с Chrome, должно быть результатом нажатия пользователем на старый добрый тег привязки с атрибутом href. Но вот ответ, который вы ищете: вы можете показать ссылку на пользователя и изменить цель ссылки на лету. Это будет считаться «правильной» ссылкой в ​​мире Chrome.

Смежные вопросы