- ベストアンサー
ウインドウの親子連携について
親ウインドウでデータを処理して、その結果だけを子ウインドウに表示します。 つまり、親が管理の画面となり、子はそれのうち必要な結果のみを見せる形です。 利用者側の状況としては、 親ウインドウ > 管理部門 子ウインドウ > 一般利用者(表示された情報を見るだけ) という感じでそれぞれを表示します。 親から子を生成し、親がボタンを押せば子がリロードするのはうまくいきました。 しかし、親の方が管理運営するために、データの変化を常にPHP(DB)に送信するのでそのたびにリロードされます(更新状態で再描画するため)。 親からのリロード指令を受けて子は自身をリロードし、親がアクセスするDBから必要な情報だけ取得して再表示します。 問題は、親がリロードすることによって、自分の生成した子供を忘れてしまうのか、 親のリロード後に子を指定している変数(下記の"cWin")の値がなくなってしまうようで子にリロードの要求を出せなくなります。 (ブラウザエラー:cWinはNullまたはオブジェクトではありません) >親ウインドウ ・ウインドウオープン function childOpen{ cWin = window.open("child.html","child","width=200,height=200,resizable=1"); } ・子ウインドウリロード指示 function childReload{ cWin.location.reload() } ウインドウオープンの指示(Form使用) <input type="button" value="表示" onClick="childOpen()"> 子ウインドウへのリロードの指示 <input type="button" value="リロード" onClick="childReload()"> なお、変数指定時に var cWin = "child"; としてもダメでした。 なんとか、親がリロードされても生成した子供を覚えておく、あるいは何らかの形で生成済みの子ウインドウを指定する方法はないでしょうか? よろしくおねがいします。 なお、対象はWindowsXP+IE6で考えています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
JavaScriptで作成した変数はリロードすれば最初の状態に戻ります。 アプリケーションの作りによって出来る場合、出来ない場合がありますが、私は以下の2つのどちらかを行います。 1.ウィンドウに名前をつける。 ウィンドウに名前をつければ、親はその名前で呼べば子ウィンドウを知ることができます。 var child = window.子ウィンドウの名前; もし子ウィンドウがいっぱい出来るようなら、どこになんて名前をつけるか厳密に管理する必要があります。 2.子が親に自分を知らせる。 子ウィンドウはwindow.openerで親ウィンドウを知ることが出来ます(たとえ親がsubmitでリロードしても)。親ウィンドウに子ウィンドウをセットするような関数を作っておけば、子ウィンドウからのアクションで親ウィンドウに自分を知らせることができます。 例) 親ウィンドウ var child; function setChild(win) { child = win; } 子ウィンドウ window.opener.setChild(window); この方法では「子ウィンドウがfunctionを実行する」という点が難点です。親が「リロードした後」という記述があるところをみると、この方法は使えないのではないかと思います。 頑張ってください。
その他の回答 (2)
#1です。 もしAjaxを使うなら参考URLをご覧下さい。 私も最近知ったのですがJavaScriptを多用するならお勧めのライブラリです。 Ajax関連も入っていて、すごく簡単にクロスブラウザのAjaxを実現できました。
お礼
ありがとうございます。 参考にさせていただきます。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
最初に、 cWin がnull または、cWin.closedの時は、開き直すようにすればいいかと思います。 if(cWin==null || cWin.closed){//開かれてない時 cWin=window.open("child.html","child","width=200,height=200,resizable=1"); } 確か、window.open は、名前が付いているウィンドウをwindow.openしようとした時は単にそのまま(新しく開かない)ので、コレで良いかと思います。 また、 Ajax的手法を使えば、親からのPHP(DB)受信時にリロードしなくて済みます。
お礼
>Ajax的手法を使えば それ、私も考えました。 出来るだけシンプルに作りたいと思ったので今回は敬遠してたのですが、どうしてもダメならそれを試すつもりでした(^^ 試すにしても、Ajaxの勉強をしないと概念しかわかってないのですが・・・。 ありがとうございました。
お礼
>var child = window.子ウィンドウの名前; 子供の名前を変数に入れるのに"window."が必要だったんですね。 うーん、こんな単純なことだったとは・・・。 すっごく助かりました。 がんばって作ってみます。