アプリ版:「スタンプのみでお礼する」機能のリリースについて

過去スレを確認しましたが、同じようない内容のモノがなかったため質問させて頂きます。

サブウィンドウ画面の制御についての質問なのですが、
親→子→孫といったように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();
}
}
-----------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++

A 回答 (2件)

親ウィンドウの子を閉じる処理に書かれた closeWin2() は、子ウィンドウに存在する関数ですよね?自分と違うウィンドウに存在する関数や変数は、そのウィンドウを指定しないと使うことができません。


つまり、親から closeWin2() を実行するには、subWin1.closeWin2() とする必要があるのです。

しかし、その直前の処理で subWin1 は閉じられてしまっているので、もう subWin1 にはアクセスできません。ですので closeWin2() は、subWin1 を閉じる前に実行する必要があります。

それと、この問題とは直接関係はありませんが、サブウィンドウを閉じる時のチェックは
  if (typeof(subWin2) != 'undefined' && !subWin2.closed)
とするとよいでしょう。
.closed(閉じられているか否か)をチェックすることで、「一度は開いたが閉じられた」場合にサブウィンドウにアクセスしようとしてエラーが出るのを防ぐことができます。
    • good
    • 0
この回答へのお礼

ご返答を頂きありがとうございます。
非常に丁寧でわかりやすい回答でした。

アドバイス頂いたように「subWin1.closeWin2()」で試してみたところ、
正しく動作するようになりました。

if (typeof(subWin2) != 'undefined' && !subWin2.closed)
↑これについてもエラーはでていませんでしたが、
一度開くとそれ以降は常にif文の中を通っていたので
対応が必要だとは思っていたので助かりました。

お忙しい中のご返答ありがとうございました。

お礼日時:2004/08/11 10:38

 親が孫のウィンドウを閉じるためには、孫のウィンドウオブジェクトのメソッドを、親のクローズと連動して起動できる状態にしておく必要があります。



 「孫画面用JavaScript」と書かれた部分をどこに実装なさっているのか分かりませんが、もし子ウィンドウに実装してるんであれば、子の onUnload イベントを使うなどして、孫を閉じる関数を呼び出す必要があります。

 また、もし親が孫をオープンしている状態にあるならば、階層数は3階層ではなく2階層です。
 よって、一般的な文法ミスで動いていないことになります。

この回答への補足

早速のお答えありがとうございます。
説明が足りなかったようなので、補足させて頂きます。

孫を開くのは子のみで、階層は3階層になります。

「子画面用JavaScript」は親画面に、「孫画面用JavaScript」は子画面で実装しています。
(わかりにくくて申し訳ないです)
親画面ではcloseWin1()を呼び、その中でcloseWin2()を呼んでいます。
しかし、親と子、子と孫といったように2画面の場合だとサブウィンドウを認識できるのですが、子に実装してある孫を閉じるcloseWin2()を親から呼ぶと孫画面が認識されず「undefined」となります。

親画面でcloseWin1()とcloseWin2()の両方を呼ぶのも試してみましたが上手く動作しませんでした。

以上です。
よろしくお願いします。

補足日時:2004/08/10 18:01
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!