Открытая страница 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
Я не уверен, что вы сможете контролировать это так, как хотите. Проблема в том, что браузеры могут решить, когда открывать окна и когда открывать вкладки. Например, 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')
}-*/;