GWT открыть страницу в новой вкладке - PullRequest
19 голосов
/ 11 октября 2010

Я разрабатываю приложение 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 как единственныйправильно, потому что я не нашел подходящего способа указать одинаковое поведение во всех ситуациях.


Ответы [ 6 ]

21 голосов
/ 16 декабря 2011

Я использовал этот код, и он работает для меня в браузерах Google Chrome и Mozilla Firefox 3.6.8. Если вы хотите открыть страницу в новом окне, вы должны написать код как

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

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

Window.open("www.google.com","_blank","");
3 голосов
/ 02 января 2012

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

  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

3 голосов
/ 12 октября 2010

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

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

2 голосов
/ 28 апреля 2011

Интересно, что chrome откроет страницу в новой вкладке, если вы поместите инструкцию 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(...);
                                }
                                ...
                            });

                        }

                    });
1 голос
/ 12 февраля 2013

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

0 голосов
/ 22 октября 2010

У меня работает этот код:

public static native String getURL(String url)/*-{
return $wnd.open(url,
'target=_blank')
}-*/;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...