風柳メモ

ソフトウェア・プログラミング関連の覚書が中心

Google Chromeでの window.open() の動作の違い

Google Chromeで(URLのみ指定で)window.open()を実行したとき、別タブで開く場合と、別ウィンドウが開く場合がある。
バージョン 33.0.1750.154 mで確認

条件

試してみて分かったことは、

  • jQuery.get() 等の、XMLHttpRequest を使用していると思われる処理の、(onreadystatechange経由でコールされた)コールバック関数内で window.open() を呼び出すと、別ウィンドウで開いてしまう

らしいということ。

コールバック関数内でも別ウィンドウでは開きたくない場合

jQuery.get() 等を呼び出す前に、予め window.open('about:blank') をコールしておき、返された子ウィンドウの window オブジェクトをコールバック関数内で使用するようにすればよい。

サンプルソース(抜粋)
var wopen = function(url, cwin){
    if (cwin) {
        // 子ウィンドウの location 変更
        cwin.location.href = url;
    }
    else {
        // 子ウィンドウのオブジェクトが渡されなかった場合
        cwin = window.open(url); // 新たに子ウィンドウを開く
    };
    return cwin;
};

$.get(location.href, function(){wopen('http://www.google.co.jp')}, 'html'); // 別ウィンドウで開いてしまう

var cwin = wopen('about:blank'); // 予めタブで開いておく
$.get(location.href, function(){wopen('http://www.google.co.jp', cwin)}, 'html'); // 開いておいたタブ内で location が変更される