- ベストアンサー
何個もウィンドウを開かれてしまった場合の対処法を教えて下さい。
親ウィンドウからSUBMITし、別窓にてCGIを動かしてまたSUBMITし、 結果を親ウィンドウに戻すCGIを作成しているのですが、 target指定をしていて、ウィンドウの名前を決めて、<FORM>で 送っています。今は、親ウィンドウも別窓ウィンドウも、 固定のウィンドウの名前にしていて、target指定しているので、 うまく動作できるのですが、 いくつも同じCGIのウィンドウを開かれて動作されてしまうと、 一番初めに開かれているウィンドウで動作 されてしまいます。 よい解決策はないでしょうか? ヤフオフのサイトは、いくつも別ウィンドウで出しても、その ウィンドウから送信できます。 良かったら教えて下さい。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No.4 回答より > onLoad は、<BODY>タグを読み込んだ直後にただちに実行されます。 それは違います。 BODY や FRAMESET に設定した onLoad は、内包する全ての要素(画像や外部スクリプトなども含む)が完全に読み込まれてから実行されます。 No.3 補足で > onload時点では、書き込むことは不可能でしょうか? > エラーとしては、NULLまたはオブジェクトがありませんと表示されます。 と書かれていますが、ちゃんと BODY の onLoad から呼び出した関数内で実行しましたか? HEAD内の <SCRIPT> ~ </SCRIPT> で書いていませんか?(ここは onLoad とは無縁の領域です。) q=61780 を参考にされたということは、その可能性が高いです。 また、ボタンを押すたびに新たなウィンドウを開く時は、target="_new" ではなく、target="_blank" です。 全体のサンプルを q=994791 の方に書きましたので、そちらを参考にしてみてください。
その他の回答 (4)
はい。出ます(^_^; onLoad は、<BODY>タグを読み込んだ直後にただちに実行されます。 よって回線速度の問題で<FORM>タグの読み込みが遅れると、「NULL または....」ってことになっちゃうんです。 これを防ぐには、そのHTMLソースの一番最後、</BODY>の後ろあたりに、 <script> document.test.target=opener.window.top.name; </script> とまぁ、こんな感じで書いておけば、少なくとも「NULL または....」のエラーは出なくなります(もし出たら、そのときは本当にオブジェクトが存在しないのです)。 ちなみに「nを進める云々」の件ですが、そのようなロジックは「子が親を操作する」限り必要ないはずです。 もし必要であれば、open を実行した回数を数えておき、for で回してやればいいのです。
補足
いつもわかりやすい回答をしていただき、有難うございます。 教えていただいた方法で、試してみたのですが、 <script> document.test.target=opener.window.top.name; </script> で記述したところ、「NULL または....」の表示 はなくなりましたが、送信ボタンを押すと targetの値をとれず、javascriptエラーになります。 「引数は無効です」と表示されます。 SUBMITした時にmake_newwin(f)を動作しようとしているのですが、 うまくtargetが取れません。 何か良い方法ありましたら、教えて下さい。 <script language="javascript" type="text/javascript"> <!-- unction make_newwin(f) { alert(f) …ここで内容を表示したところ[object]と表示されました。 var w = window.open('about:blank', f.target); w.focus(); window.close(); } <FORM name="test" action="/cgi-bin/test.cgi" method="post" target="" onSubmit="make_newwin(this);"> <input name = "aaa" type = "hidden" value ="10000" > : </FORM> </BODY> <script> document.test.target=opener.window.top.name; </script> </HTML>
勘違いしてました。 子が親を操作するんですね? であれば、JavaScript は opener というオブジェクトを持っています。 これは、自分自身を開いたウィンドウのオブジェクトです。 alert(opener.document.form.s1.value); といったような使い方で、親ウィンドウの値を取得したり、逆に代入したりできます。
補足
たびたびの回答有難うございます。 凄く苦戦しているのですが、 <form name="test" target="">の際に、このtarget=""の 空白部分に、親ウィンドウ名を書き込みたいのですが、 以下のような記述をすると、javascriptエラーになるのですが、 document.test.target=opener.window.top.name; このtarget=""にonload時点では、書き込むことは 不可能でしょうか? エラーとしては、NULLまたはオブジェクトがありませんと 表示されます。 また、回答して頂いた方で、わからないことがありまして、 配列は、どのようにnを進めていけばいいのでしょうか? if文を書けばいいのでしょうか? 教えて下さい。
数が分かってる場合は、 w1 = window.open(....); w2 = window.open(....); w3 = window.open(....); といったように個別に変数を用意しても構いません。 しかし数が分からない場合、 w = new Array(100); w[n] = window.open(...); といったように、配列化しておく必要があります。 open が返すのは、新しく生成されたウィンドウの window オブジェクトですので、 alert(w[0].document.all.form.s1.value); といったように、フォームのオブジェクトを取り出したり、逆に代入したりもできます。
補足
早速の回答有難うございます。以下の回答を参考に、 親 → 子 → 親(更新)の流れで作成しています。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=61780 deagleさんの回答を考えてみますと、親ウィンドウで function win(){ w = new Array(100); w[n] = window.open(...); } <FORM name="teat" target="_new" onsubmit="win()"> としておきますと、w[n] = window.open(...);この...の部分は、 どのように記述すれば良いのでしょうか? これで、子ウィンドウが開きますよね。今、開いた親のウィンドウ名を 取得するには、どのようにすればいいのでしょうか? 難しく考えすぎていますでしょうか?良かったら教えてください。
open() の第2引数にターゲット名を指定しますが、この名前を "_new" にします。 ただし、親から子を制御する場合、open() メソッドが返すハンドルを、個別に制御する必要があります。
補足
回答有難うございます。 どのように個別に制御すればいいのでしょうか? 良かったら教えてください。
お礼
無事にこの問題を解決する事ができました。 本当に有難うございました。