- PR -

onUnload処理の制御について

投稿者投稿内容
いのき
ベテラン
会議室デビュー日: 2005/10/06
投稿数: 88
投稿日時: 2005-11-07 18:22
いつもお世話になります。いのきです。

度々、javascriptの画面制御の質問で申し訳ありません。

下記内容の画面があります。
・A(親)・・・サブミット処理で再描画あり
・B(子)・・・Aにぶらさがる子画面

AのonUnloadにてBも閉じる処理を行っています。
しかし、再描画の場合はBを閉じたくないのですが、AのonUnload処理で、Bが閉じてしまいます。
window.closedで画面が閉じていたらという条件を入れても同じ結果でした。
onUnloadで再描画の場合Bは閉じず、Aを完全に閉じた場合のみBも閉じる処理を行いたいのですが、
どなたかご存知の方、ご教授をお願い致します。
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2005-11-07 18:59
こんにちは、でっちです。

OnUnloadだと無理かな。
逆の発想で、Bから「Aが生きているか」を定期的に見に行けばどうでしょう?

Bにこんな関数を用意しておいて、
コード:

function openercheck_and_close(){
if (opener.closed) {
window.close();
}
}

setTimeoutで定期的に呼ばれるようにしておくと言う手です。

Aが画面遷移した場合にも閉じたいのならもう一工夫必要ですけどね。

[ メッセージ編集済み 編集者: でっち6号 編集日時 2005-11-07 19:02 ]
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2005-11-07 19:03
A画面のonUnloadにて、以下のようなコードを書いているとします。
コード:
B画面.close();



これを
コード:
if(Bを閉じていい){

B画面.close();
}


とすれば、「Bを閉じていい」がtrueの場合しかBが閉じません。(当たり前ですが)

「Bを閉じていい」をグローバルに宣言し初期値をtrueとしておけば、
あとはいのきさんの都合のいいタイミングでfalseをセットすることで、お望みの処理が実現できそうです。

都合のいいタイミングに処理を入れることはできませんか?
(例えば、「更新」ボタンのonclickとか。formのonsubmitとか。)

あ。この方法ですと、ブラウザのリロードボタン等では、B画面を制御することはできません。(処理を入れられませんからね。)

# でっち6号さんとmioさんの投稿をみてちょっと編集


[ メッセージ編集済み 編集者: He 編集日時 2005-11-07 19:16 ]
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2005-11-07 19:05
これは、でっち6号さんのようにするしかないですね。
表示項目はともかく、ツールバーや×ボタンなんかの制御はできないから。
いのき
ベテラン
会議室デビュー日: 2005/10/06
投稿数: 88
投稿日時: 2005-11-07 20:11
いつもお世話になります。いのきです。

でっちさん、Heさん、mioさん回答ありがとうございました。

なるほど、逆の発想ですか!気づきませんでした(涙)。
確かに子画面側でこの方法をやるといけそうですね。
でも、setTimeoutで定期的に呼ばれるようにするにはどうすればよろしいでしょうか?
onLoad処理に
var chkOpenerTime = setTimeout("openercheck_and_close();", i += 3000);
といれてやってるのですが、1回しか呼ばれないです・・・。
度々で申し訳ありませんが、ご教授をお願い致します。
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2005-11-07 20:15
でっちです。

第二引数が評価式と判断されてるからかな? (^_^;

普通にmsecを数値で指定すれば良いですよ。
chkOpenerTime = setTimeout("openercheck_and_close();", 3000);
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2005-11-07 20:21
繰り返し呼び出したいなら、setInterval関数ですよ。
setTimeoutは指定された時間経過後に指定された関数を実行します。
いのき
ベテラン
会議室デビュー日: 2005/10/06
投稿数: 88
投稿日時: 2005-11-07 20:23
いつもお世話になります。いのきです。

でっちさん、度重なるご返答、誠にありがとうございます。
やはり、setTimeoutは1回しか呼ばれないです(涙)。
質問なのですが、setIntervalではダメなのでしょうか?

あ、Heさんとかぶった・・・。

[ メッセージ編集済み 編集者: いのき 編集日時 2005-11-07 20:24 ]

スキルアップ/キャリアアップ(JOB@IT)