- ベストアンサー
サブウィンドウの画面制御について
過去スレを確認しましたが、同じようない内容のモノがなかったため質問させて頂きます。 サブウィンドウ画面の制御についての質問なのですが、 親→子→孫といったように3画面同時に表示する場合があります。 この時、親を閉じると子と孫も、子を閉じると孫も同時に閉じたいと思っています。 しかし親から子、子から孫といったように一階層だと閉じることができますが、 親から孫と二階層になると閉じる事ができません。 どなたか解決方法をご存知の方がおられましたら、 ご教授頂けますでしょうか。 よろしくお願いします。 実装内容は以下のようになっています。 (必要部分以外は省略しています) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ----------------子画面用JavaScript-------------------- ◆子を開く function openWin1(){ subWin1 = window.open(url,"subWin1",""); } ◆子を閉じる function closeWin1(){ if(typeof(subWin1) != 'undefined') { // 子ウィンドウを閉じる subWin1.close(); } // 孫ウィンドウを閉じる closeWin2(); } ----------------------------------------------------- ---------------孫画面用JavaScript-------------------- ◆孫を開く function openWin2(){ subWin2 = window.open(url,"subWin2",""); } ◆孫を閉じる function closeWin2(){ if(typeof(subWin2) != 'undefined') { // 孫ウィンドウを閉じる subWin2.close(); } } ----------------------------------------------------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
親ウィンドウの子を閉じる処理に書かれた closeWin2() は、子ウィンドウに存在する関数ですよね?自分と違うウィンドウに存在する関数や変数は、そのウィンドウを指定しないと使うことができません。 つまり、親から closeWin2() を実行するには、subWin1.closeWin2() とする必要があるのです。 しかし、その直前の処理で subWin1 は閉じられてしまっているので、もう subWin1 にはアクセスできません。ですので closeWin2() は、subWin1 を閉じる前に実行する必要があります。 それと、この問題とは直接関係はありませんが、サブウィンドウを閉じる時のチェックは if (typeof(subWin2) != 'undefined' && !subWin2.closed) とするとよいでしょう。 .closed(閉じられているか否か)をチェックすることで、「一度は開いたが閉じられた」場合にサブウィンドウにアクセスしようとしてエラーが出るのを防ぐことができます。
その他の回答 (1)
親が孫のウィンドウを閉じるためには、孫のウィンドウオブジェクトのメソッドを、親のクローズと連動して起動できる状態にしておく必要があります。 「孫画面用JavaScript」と書かれた部分をどこに実装なさっているのか分かりませんが、もし子ウィンドウに実装してるんであれば、子の onUnload イベントを使うなどして、孫を閉じる関数を呼び出す必要があります。 また、もし親が孫をオープンしている状態にあるならば、階層数は3階層ではなく2階層です。 よって、一般的な文法ミスで動いていないことになります。
補足
早速のお答えありがとうございます。 説明が足りなかったようなので、補足させて頂きます。 孫を開くのは子のみで、階層は3階層になります。 「子画面用JavaScript」は親画面に、「孫画面用JavaScript」は子画面で実装しています。 (わかりにくくて申し訳ないです) 親画面ではcloseWin1()を呼び、その中でcloseWin2()を呼んでいます。 しかし、親と子、子と孫といったように2画面の場合だとサブウィンドウを認識できるのですが、子に実装してある孫を閉じるcloseWin2()を親から呼ぶと孫画面が認識されず「undefined」となります。 親画面でcloseWin1()とcloseWin2()の両方を呼ぶのも試してみましたが上手く動作しませんでした。 以上です。 よろしくお願いします。
お礼
ご返答を頂きありがとうございます。 非常に丁寧でわかりやすい回答でした。 アドバイス頂いたように「subWin1.closeWin2()」で試してみたところ、 正しく動作するようになりました。 if (typeof(subWin2) != 'undefined' && !subWin2.closed) ↑これについてもエラーはでていませんでしたが、 一度開くとそれ以降は常にif文の中を通っていたので 対応が必要だとは思っていたので助かりました。 お忙しい中のご返答ありがとうございました。