• ベストアンサー

window.closedについて

ウィンドウが開いているかどうかを確認するため、window.closedを使用しております。(ソースは下記参照) しかし、w1=window.open("","Page2");が一度も実行されていない場合は、w1オブジェクトが存在しないためエラーになってしまいます。 対応方法として、 1、HTML、またはcookieに、Page2を開いたことがあるかどうかフラグを持たせる。 ことを考えていますが、どうもスマートではなく納得がいきません。 その他、対応方法がございましたらご教授ください。 宜しくお願い致します。 ---------------ソース--------------------------- ○Javascript funciton test(){ if(w1.closed){ w1=window.open("","Page2"); } document.frm1.submit(); } ○HTML <a herf="javascript:void(0)" onclick="test();">実行</a> <form method="post" name="frm1" action="#" target="Page2"> <input type="hidden" name="id" value="1115" /> </form>

質問者が選んだベストアンサー

  • ベストアンサー
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.5

if (w1 != null && w1 != undefined){ 部分がうまく働いておりません。 >> うーん。うちの環境だと 定義してない(w1=window.openを実行していない)と w1は"undefined"になっているんですけどねえ。 if (typeof w1 != 'undefined'){ でも一緒ですけど。

mori1115
質問者

補足

いろいろありがとうございます。 typeof w1 != 'undefined' でうまく働きました。 もう一つご教授ください。 w1はページがreloadされると消えてしまいますが、これを生かしておく方法はあるのでしょうか?サーバーサイドに逃がしたりする方法とかあるのでしょうか?

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.4

<w1のスコープはどうなるのでしょうか?> funciton test(){ if (w1 != null && w1 != undefined){ w1.close(); }else{ w1=window.open("","Page2"); } document.frm1.submit(); } のように関数内でvarを付けないと、自動的に グローバル変数になります。 var w1; function test(){ ---- } と同じです。 一方、 funciton test(){ if (w1 != null && w1 != undefined){ w1.close(); }else{ var w1=window.open("","Page2"); } document.frm1.submit(); } 関数内でvar付きで宣言すると、宣言している位置にかかわらず、 関数先頭で宣言された事になり、その関数内でのみ参照可能な ローカル変数になります。この場合、関数が呼ばれるたびに w1が初期化されますから、いつも'undefime'のはずです。

mori1115
質問者

補足

たびたびすいません、もう一つ教えてください。 w1 != null && w1 != undefined 部分がうまく働いておりません。 w1を定義せずに使った場合、w1を捕まえるには何を使えばよいのでしょうか? w1==null でも w1==undefinedでもうまくいきません。 宜しくお願い致します。

すると、全ての回答が全文表示されます。
回答No.3

こういうことでしょうか? var w1; if(!w1||w1.closed){ w1=open("","Page2"); }else{ w1.location.href="Page2"; } 通常は同じtargetを指定しておけば同じウインドウで表示するはずですので、closedを使うことはほとんどないと思います。 w1=open("page2", "Page2"); > 1、HTML、またはcookieに、Page2を開いたことがあるかどうかフラグを持たせる。 > ことを考えていますが、どうもスマートではなく納得がいきません。 よくわかりませんが、たとえば昨日アクセスしたときにPage2を開いたのも履歴として持たせたいなら、cookieしか方法はないと思います。 (HTML5のデータベースや、サーバーにアカウント情報として履歴を残すのは別)

すると、全ての回答が全文表示されます。
回答No.2

いや~てまえみそで はずかしい はなしなのだけれど undefined はグローバルで undefined = true; もできるってさぁ。 このあいだおしえてもらいました。 だから typeof w1 != 'undefined'

すると、全ての回答が全文表示されます。
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

意図がよくわからないけど、普通は var w1; if (w1 != null && w1 != undefined){ w1.close(); }else{ w1=window.open("","Page2"); } でしょ。

mori1115
質問者

補足

早速のご回答ありがとうございます。 変なことを聞くかもしれませんが、教えてください。 w1のスコープはどうなるのでしょうか? 上記関数を実行後、また同じ関数を実行された場合、w1は初期化されないのですか? 同様に、上記関数実行後、別関数で同じくw1を調べることは可能ですか? w1をグローバルに持たせておいて、イベントハンドラごとにw1の中を調べたいと考えております。

すると、全ての回答が全文表示されます。

関連するQ&A