
対象ブラウザはIE6~8です。
2つのウィンドウA/Bが連動するプログラムを作っています。
ウィンドウAにはウィンドウBを開くためのボタンがあり、
Aより先にBが開くことはありません。必ずAからBが派生します。
Aはwindow.openの戻り値を保持することで、B内部のJavaScriptにアクセスします。
Bはwindow.openerプロパティを経由することで、A内部のJavaScriptにアクセスします。
しかし、Aには自身をリロードする機能があり、
リロードすると保持していたBのウィンドウオブジェクトを失ってしまいます。
そこでAがリロードし終わったとき(onloadのタイミング)に、
何とかしてBのウィンドウオブジェクトを取得しなければなりません。
window.openではウィンドウに名前を付けることができますが、
その名前からウィンドウオブジェクトを取得するような、
document.getElementByNameみたいなメソッドは存在しないでしょうか?
あるいは、BからAの監視を続け、リロードが終わった時に
window.opener経由でメッセージを送る等の処理を実現する手段はないでしょうか?
よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
>あるいは、BからAの監視を続け、リロードが終わった時に
>window.opener経由でメッセージを送る等の処理を実現する
>手段はないでしょうか?
簡単なテストをしてみましたが、できないことはなさそう。
ただし、いろいろな可能性があるので、それにちゃんと対処しようとすると少々面倒そうな気が…
以下、正常な処理の場合。
1)AのunloadイベントでBの関数を呼び出す。
2)Bの関数からsetTimeoutなどでBの監視関数を呼び出す。
3)Bの監視関数はopenerのreadyStateがcompleteになるまで、自分自身をsetTimeoutなどで呼ぶ。
4)completeを確認したら、opnerの受取り用関数にB自身を引数で送る。
単純に予定通りの操作しかなければ(↑)で再取得できるみたいですが、実際は、Bが手動で閉じられていたりAが別のサイトにジャンプする(unloadイベントなので)などなどその他のケースも考えると、けっこう面倒そうです。
別のアイデアとして…
・Aから同じ名前でBを開き直せば(多分、名前を付けているでしょうから)、Bを再取得することが可能です。
・それなので、Bを開いているか否かをクッキーに保存しておいて、それを確認してAのload時にBを開くかを決めることにしてあげればよさそう。
・Bが別のサイトに遷移したりクローズされたりする場合を考えると、Bのunloadでクッキーを書きかえる。
・Bのリロードも考慮するなら、loadでクッキーへ書込む必要があり、結局は、クッキーの書込みは全てB側で行い、Aは参照するだけということになりそう。
こちらはテストしていませんので、アイデアのみです。他に問題があるかも。
いずれにしろ、面倒そうですね。
回答ありがとうございます。
同名でwindow.openし直す、ナイスアイディアです。
お陰さまで望み通りの動作が実現できました。
細かい検証はこれからやっていきますが、大変助かりました。
ありがとうございました。
No.3
- 回答日時:
質問タイトルの答えは
http://okwave.jp/qa/q6731947.html へ。ただし、再読込した時点で window.b を見失うような気もしますけどね。
私なら #2 で紹介されているように window.b の open/close をどこか(CookieとかGETパラメータとか)に記憶させて、window.b を開き直します。
この回答への補足
回答ありがとうございます。
今回はASP.NETを利用しているので(今思えば先に言うべき情報でしたね、すみません
HiddenFieldを利用して「Bが開いているか」を保持させることにしました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのシート上に別のシー...
-
Edge Chrom などの超初心者質問...
-
インタネットからPDFファイルだ...
-
ポップアップと作業ウィンドウ...
-
Javascript_submit()完了後に処...
-
pythonで変数にオブジェクトを...
-
子ウィンドウから親ウィンドウ...
-
処理終了後にウインドウを閉じる
-
チェックボックス付きツリービュー
-
子ウィンドウから親ウィンドウ...
-
MATLABのguiで別画面を表示する...
-
ウィンドウの2重起動を防止したい
-
リンク時、親ウインドウを最前...
-
デジタル時計の時刻合わせの方...
-
マイページはどこを開くの
-
[Java] Edgeでのアドレスバー非...
-
スクリプトって、何ですか?ど...
-
Youtubeのバグ
-
複数の画像を横にスクロールさ...
-
一定時間おきにアラームやポッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Edge Chrom などの超初心者質問...
-
エクセルのシート上に別のシー...
-
Javascript_submit()完了後に処...
-
デスクトップ画面を4分割するには
-
VBの画面で、全ウィンドウを一...
-
ウィンドウの2重起動を防止したい
-
ブラウザの×ボタンを効かなくす...
-
VBAで任意のウインドウのサイズ...
-
ポップアップと作業ウィンドウ...
-
javascriptで開いたウィンドウ...
-
1クリックでモーダルを開いてか...
-
初心者javascript グーグルクロ...
-
子ウィンドウから親ウィンドウ...
-
インタネットからPDFファイルだ...
-
子ウィンドウより親ウィンドウ...
-
ウィンドウ名からウィンドウオ...
-
IEでのみ発生するJavaScriptエラー
-
JavaScriptで指定Windowを最大...
-
プロジェクタでメニューを非表...
-
子ウィンドウから親ウィンドウ...
おすすめ情報