- ベストアンサー
ウィンドウ名からウィンドウオブジェクトを取得する方法
- ウィンドウAからウィンドウBを開くプログラムを作成していますが、AがリロードするとBのウィンドウオブジェクトを失ってしまいます。
- ウィンドウBからウィンドウAを監視し、リロードが終わったらメッセージを送ることで、Bのウィンドウオブジェクトを取得する方法を検討しています。
- また、ウィンドウ名からウィンドウオブジェクトを取得するようなメソッドは存在しないか調査しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>あるいは、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は参照するだけということになりそう。 こちらはテストしていませんので、アイデアのみです。他に問題があるかも。 いずれにしろ、面倒そうですね。
その他の回答 (2)
- think49
- ベストアンサー率59% (285/482)
質問タイトルの答えは http://okwave.jp/qa/q6731947.html へ。 ただし、再読込した時点で window.b を見失うような気もしますけどね。 私なら #2 で紹介されているように window.b の open/close をどこか(CookieとかGETパラメータとか)に記憶させて、window.b を開き直します。
補足
回答ありがとうございます。 今回はASP.NETを利用しているので(今思えば先に言うべき情報でしたね、すみません HiddenFieldを利用して「Bが開いているか」を保持させることにしました。 ありがとうございました。
- t_ohta
- ベストアンサー率38% (5238/13705)
ウィンドウAをリロードさせずに、Ajaxを使って内容だけを書き換えてはどうでしょうか。
お礼
回答ありがとうございます。 恐らくそれが最もスマートな方法なのだと思います。 しかし、今回は既に出来上がっているプログラムの機能追加であり、 納期の関係上、今からAjax化することが極めて困難なのです。。。
お礼
回答ありがとうございます。 同名でwindow.openし直す、ナイスアイディアです。 お陰さまで望み通りの動作が実現できました。 細かい検証はこれからやっていきますが、大変助かりました。 ありがとうございました。