Подтвердить что ты не робот

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


4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

  • Перед вызовом метода Async держите ссылку на новое окно с пустыми параметрами.
  • В методе 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

Ответ 4

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

                        }

                    });

Ответ 5

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

Ответ 6

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

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