2010-10-11 10 views
19

Zajmuję się tworzeniem aplikacji GWT i używamGWT otwarty w nowej karcie

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

aby otworzyć nową stronę. I otwiera się w nowej karcie po wywołaniu, na przykład, bezpośrednio po kliknięciu przycisku. Ale postanowiłem zrobić kilka walidacji na serwerze przed otwarciem nowej strony i umieścić wezwanie do wyżej wymienione metody do

public void onSuccess(Object response) { 
} 

i zaczyna otwarcie strony w nowym oknie zamiast nowej karcie (dotyczy to tylko w przeglądarce Chrome pozostałe przeglądarki nadal otwierają ją w nowej karcie).

Czy ktoś może mi pomóc?


Zbudowałem mały przykład do zilustrowania problemu:

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) otwiera obie strony w nowych kartach.
  • Chrome (6.0) otwiera "google.com" w nowej karcie, a "bing.com" w nowym oknie
  • Opera (10.10) otwiera się w nowych zakładkach.
  • IE (8.0) otwiera się zarówno w nowym systemie Windows.

zaznaczyłem odpowiedź igorbel „s jako jedynie słuszne bo nie znaleziono żadnych właściwy sposób, aby określić takie samo zachowanie w każdej sytuacji.


+1

To z tego pytania było dla mnie pomocne, aby dowiedzieć się, jak otworzyć nową kartę: com.google.gwt.user.client.Window.open (pageUrl, "_blank", ""); – cellepo

Odpowiedz

3

Nie jestem pewien, czy będziesz w stanie kontrolować to tak, jak chcesz. Problem polega na tym, że przeglądarki mogą decydować, kiedy otworzyć okna i kiedy otwierać karty. Na przykład firefox ma opcję: "Zamiast tego otwórz nowe okna w nowych kartach". I nie zapomnij o przeglądarkach, które nie obsługują kart (tak, one wciąż istnieją).

Ponieważ jest to problematyczny aspekt doświadczenia użytkownika, moim zaleceniem byłoby ponowne rozpatrzenie projektu. Czy naprawdę ważne jest, aby aplikacja rozróżniała otwarcie nowej karty i otwarcie nowego okna?

0

Ten kod działa dla mnie:

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

Ciekawa rzecz, chrom otworzy stronę w nowej karcie w przypadku jeśli umieścisz window.open (...) pouczenie do ciała realizacji kliknięcie handler .

Na przykład:

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

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

        }); 

a strona zostanie otwarta w oddzielnym oknie w przypadku, gdy będę obejmować dowolną asynchroniczny. wniosek do wspomnianego kodu:

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

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

         } 

        }); 
20

Użyłem tego kodu i działa on dla mnie w Google Chrome i mozilla firefox 3.6.8 przeglądarek Jeśli chcesz otworzyć stronę w nowym oknie, należy wpisać kod jak

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

Jeśli chcesz otworzyć stronę w nowej karcie należy wpisać kod jak

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

Czy możesz podać więcej informacji na temat trzeciego parametru? Co to znaczy i jak się go używa? – RAS

+3

@RAS: Zobacz https://developer.mozilla.org/en/DOM/window.open –

3

ten kod działa dla mnie:

  1. Przed wywołaniem metody Async zachowaj odwołanie do nowego okna z pustymi parametrami.
  2. W metodzie onSuccess() ustaw adres URL okna.

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

można znaleźć w: http://groups.google.com/group/google-web-toolkit/browse_thread/thread/574b3b828271ba17

1

Sposób, Chrome wygląda na to, nazywając Window.open() jest jak próbuje otworzyć okno pop-up na twarzy użytkownika. To jest niezadowolone i uruchomi wbudowany bloker pop-up. Po kliknięciu linku Chrome powinien być wynikiem kliknięcia przez użytkownika starego dobrego tagu kotwicy za pomocą atrybutu href. Ale tutaj leży odpowiedź, której szukasz: możesz pokazać link do użytkownika i zmienić cel linku w locie. To by było zakwalifikowane jako "właściwy" link w świecie Chrome.

Powiązane problemy