2011年11月6日日曜日

window.nameで止まる?[javascript]

基本Chromeで見てるので、IEはいつも後回しなんだけど、しょっちゅうIEで何か不具合があります・・

ポップアップでWindowを開くページがありました。
複数のリンクがあるけど、同じリンク先がいくつか現れる可能性もあります。

Windowをポップアップした状態で、また同じポップアップリンクを押してしまった場合、もうWindowは開かないという処理が必要です。

こんな時はwindowのnameプロパティを使って制御するわけですが、IEで見ると何故かwindow.nameを参照したところで止まってしまいます。


var win; // グローバル変数でWindowオブジェクトを管理

$('#elm').click(function() {
    var win_name = $('input[name="xx"]').val();
    if (win && win.name == win_name) {
        return false;
    }
    win = window.open('xx.html', win_name);
});


まぁザックリとこんな感じです。
これはChromeとかFirefoxでは動くけどIE9で見てたらif文のところで止まる場合があります。

止まる「場合がある」というのは、止まらない場合もあるということです。

window.openしたWindowを閉じてから、また別のリンクを開こうとした際に止まるようです。

1回目ポップアップを開いた時は、グローバル変数のwinは空なので、if文を抜けてwindow.openします。
そして、そのWindowを閉じてからもう一回ポップアップを開く時、winにはWindowオブジェクトが格納されているのですが、プロパティを参照できない状態という感じなんだと思います。

なので、Windowが閉じたかどうかをチェックしないといけなかったわけです。


var win; // グローバル変数でWindowオブジェクトを管理

$('#elm').click(function() {
    var win_name = $('input[name="xx"]').val();
    if (win && !win.closed && win.name == win_name) {
        return false;
    }
    win = window.open('xx.html', win_name);
});


こうして、window.closedプロパティを見れば無事思った動作になりました。
分かりにくかったのは、winにWindowオブジェクトが入ってるけど、もうWindowのプロパティがないという状態だったということですね。
多分Chromeとかだと、windowを閉じた時点でwin自体がnullになってるんでしょうか?
そこまでチェックはしてないけど、とりあえず解決できました。

0 件のコメント:

コメントを投稿