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の答えを唯一の正しいcoとしてマークしました。すべての状況で同じ動作を指定する適切な方法を見つけられませんでした。
あなたがこれをあなたが望む方法で制御できるようになるかどうかはわかりません。問題は、ブラウザーがウィンドウを開くタイミングとタブを開くタイミングを決定できることです。たとえば、Firefoxには「新しいタブで新しいウィンドウを開く」というオプションがあります。そして、タブをサポートしていないブラウザーを忘れないでください(そうです、それらはまだ存在しています)。
これはユーザーエクスペリエンスの問題の多い側面であるため、デザインを再検討することをお勧めします。アプリケーションにとって、新しいタブを開くことと新しいウィンドウを開くことを区別することは本当に重要ですか?
私はこのコードを使用しましたが、google chromeおよびmozilla firefox 3.6.8ブラウザで動作します。新しいウィンドウでページを開きたい場合は、次のようにコードを記述してください。
Window.open("www.google.com","_blank","enabled");
新しいタブでページを開きたい場合は、次のようにコードを書く必要があります
Window.open("www.google.com","_blank","");
このコードは私にとってはうまくいきます:
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
興味深いことに、chromeは、window.open(...)命令をクリックハンドラーの実装の本体に配置した場合に備えて、新しいタブでページを開きます。
例えば:
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()
を呼び出す方法は、ユーザーの顔でポップアップウィンドウを開こうとするようなものです。これは眉をひそめ、組み込みのpopをトリガーします-upブロッカー。Chromeによると、リンクをたどるのは、ユーザーがhref
属性を持つ古き良きアンカータグをクリックした結果であるはずです。しかし、ここにあなたが探している答えがあります。ユーザーへのリンクとその場でリンクターゲットを変更します。これはChromeの世界では「適切な」リンクと見なされます。
このコードは私にとってはうまくいきます:
public static native String getURL(String url)/*-{
return $wnd.open(url,
'target=_blank')
}-*/;