GWT在新选项卡中打开页面

时间:2010-10-11 15:16:12

标签: java javascript gwt google-chrome

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


6 个答案:

答案 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)

此代码适用于我:

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

  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')
}-*/;