我正在开发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", "");
}
}
);
}
});
我将igorbel的答案标记为唯一正确的cos我没有找到任何适当的方法在所有情况下指定相同的行为。
答案 0 :(得分:21)
我使用了这段代码,它适用于Google Chrome和Mozilla firefox 3.6.8浏览器 如果要在新窗口中打开页面,则应将代码编写为
Window.open("www.google.com","_blank","enabled");
如果要在新标签页中打开页面,则应将代码编写为
Window.open("www.google.com","_blank","");
答案 1 :(得分:3)
我不确定你是否能够以你想要的方式控制它。问题是浏览器可以决定何时打开窗口以及何时打开选项卡。例如,firefox有选项:“在新标签中打开新窗口”。并且不要忘记不支持标签的浏览器(是的,那些仍然存在)。
由于这是用户体验的一个问题,我的建议是重新考虑您的设计。对于应用程序来说,区分打开新选项卡和打开新窗口是否真的很重要?
答案 2 :(得分:3)
此代码适用于我:
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 :(得分:2)
有趣的事情, 如果将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(...);
}
...
});
}
});
答案 4 :(得分:1)
Chrome看待它的方式,调用Window.open()
就像尝试打开用户脸上的弹出窗口一样。这是不赞成的,并将触发内置的弹出窗口阻止程序。根据Chrome,链接后应该是用户点击带有href
属性的旧锚标记的结果。但这里找到了您正在寻找的答案:您可以显示指向用户的链接并动态更改链接目标。这将成为Chrome世界中“适当”的链接。
答案 5 :(得分:0)
此代码适用于我:
public static native String getURL(String url)/*-{
return $wnd.open(url,
'target=_blank')
}-*/;