web-dev-qa-db-fra.com

GWT ouvrir la page dans un nouvel onglet

Je développe une application GWT et j'utilise 

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

pour ouvrir une nouvelle page. Et il s'ouvre dans un nouvel onglet lorsqu'il est appelé, par exemple, directement après un clic sur le bouton . 

public void onSuccess(Object response) {
}

Et il commence à ouvrir les pages dans une nouvelle fenêtre au lieu d'un nouvel onglet (cela ne vaut que pour Chrome, les autres navigateurs l'ouvrent toujours dans un nouvel onglet).

Quelqu'un peut-il m'aider?


J'ai construit un petit exemple pour illustrer le problème:

    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) ouvre les deux pages dans de nouveaux onglets.
  • Chrome (6.0) ouvre "google.com" dans un nouvel onglet et "bing.com" dans une nouvelle fenêtre
  • Opera (10.10) s'ouvre dans de nouveaux onglets.
  • IE (8.0) s'ouvre dans Windows.

J'ai marqué la réponse d'igorbel comme étant le seul correct, car je n'ai trouvé aucun moyen approprié de spécifier le même comportement dans toutes les situations.


19
Zalivaka

Je ne suis pas sûr que vous allez pouvoir contrôler cela comme vous le souhaitez. Le problème est que les navigateurs peuvent décider quand ouvrir des fenêtres et quand ouvrir des onglets. Par exemple, Firefox a l’option suivante: "Ouvrir de nouvelles fenêtres dans de nouveaux onglets". Et n'oubliez pas les navigateurs qui ne prennent pas en charge les onglets (oui, ceux-ci existent toujours).

Comme il s’agit là d’un aspect problématique de l’expérience utilisateur, ma recommandation serait de reconsidérer votre conception. Est-il vraiment important pour votre application de faire la différence entre l’ouverture d’un nouvel onglet et l’ouverture d’une nouvelle fenêtre?

3
igorbel

J'ai utilisé ce code et cela fonctionne pour moi dans les navigateurs Google Chrome et Mozilla Firefox 3.6.8 Si vous souhaitez ouvrir une page dans une nouvelle fenêtre, vous devez écrire le code comme 

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

Si vous voulez ouvrir une page dans un nouvel onglet, vous devez écrire le code comme suit:

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

Ce code fonctionne pour moi:

  1. Avant d'appeler la méthode Async, conservez une référence à une nouvelle fenêtre avec des paramètres vides. 
  2. Dans la méthode onSuccess (), définissez l'URL de la fenêtre.

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

Trouvé à: http://groups.google.com/group/google-web-toolkit/browse_thread/thread/574b3b828271ba17

3
Raz Oz

Ce qui est intéressant, Chrome ouvrira la page dans un nouvel onglet si vous mettez une instruction window.open (...) dans le corps de l’implémentation du gestionnaire de clics.

Par exemple:

Button someButton = new Button("test",
                    new ClickHandler() {

                        public void onClick(ClickEvent event) {
                            Window.open(...);
                        }

                    });

Et une page sera ouverte dans la fenêtre séparée au cas où j'inclurais un Async. demande dans le code mentionné:

Button someButton = new Button("test",
                    new ClickHandler() {

                        public void onClick(ClickEvent event) {
                            someService.doSomething(new AsyncCallback() {
                                void onSuccess(Object o) {
                                    Window.open(...);
                                }
                                ...
                            });

                        }

                    });
2
Max

À la manière de Chrome, appeler Window.open() revient à essayer d'ouvrir une fenêtre contextuelle sur le visage de l'utilisateur. Cela est mal vu et va déclencher le bloqueur de pop-up intégré. Selon Chrome, le suivi d'un lien devrait résulter du fait qu'un utilisateur clique sur une bonne vieille balise d'ancrage dotée d'un attribut href. Mais voici la réponse que vous recherchez: vous pouvez afficher un lien vers l'utilisateur et modifier la cible du lien à la volée. Cela constituerait un lien "approprié" dans le monde de Chrome.

1
Lajos Nagy

Ce code fonctionne pour moi:

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