GWT在新选项卡中打开页面

我正在开发GWT应用程序,我使用

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

打开新页面。 然后在调用时打开一个新选项卡,例如,在按钮单击后直接调用。 但我决定在打开新页面之前在服务器上进行一些validation,并将调用上面提到的方法放到

 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的答案标记为唯一正确的cos我没有找到任何适当的方法在所有情况下指定相同的行为。


我不确定你是否能按照你想要的方式控制它。 问题是浏览器可以决定何时打开窗口以及何时打开选项卡。 例如,firefox有选项:“在新标签中打开新窗口”。 并且不要忘记不支持选项卡的浏览器(是的,那些仍然存在)。

由于这是用户体验的一个问题,我的建议是重新考虑您的设计。 对于您的应用程序来说,区分打开新选项卡和打开新窗口是否真的很重要?

我使用了这段代码,它适用于我的谷歌浏览器和Mozilla Firefox 3.6.8浏览器如果你想在新窗口中打开一个页面,你应该编写代码为

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

如果要在新选项卡中打开页面,则应将代码编写为

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

这段代码适合我:

  1. 在调用Async方法之前,请保持对具有空参数的新窗口的引用。
  2. 在onSuccess()方法中设置窗口的URL。

 Button someButton = new Button("test"); SelectionListener listener = new SelectionListener() { 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

有趣的是,如果你将window.open(…)指令放入click处理程序实现的主体中,chrome将在新选项卡中打开页面。

例如:

 Button someButton = new Button("test", new ClickHandler() { public void onClick(ClickEvent event) { Window.open(...); } }); 

如果我要包含任何异步,将在单独的窗口中打开一个页面。 请求进入上述代码:

 Button someButton = new Button("test", new ClickHandler() { public void onClick(ClickEvent event) { someService.doSomething(new AsyncCallback() { void onSuccess(Object o) { Window.open(...); } ... }); } }); 

Chrome看待它的方式,调用Window.open()就像试图打开用户脸上的弹出窗口一样。 这是不赞成的,并将触发内置的弹出窗口阻止程序。 根据Chrome,链接后应该是用户点击带有href属性的旧锚标记的结果。 但这里找到了您正在寻找的答案:您可以显示指向用户的链接并动态更改链接目标。 这将成为Chrome世界中“适当”的链接。

这段代码适合我:

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