- ベストアンサー
JavaScript 子ウィンドウにデータを表示したいが・・
JavaScriptで子ウィンドウを開いて、そこの<textarea>にデータをセットしたいのですがうまくいきません。 親は <input type="button" value="Out" onClick="output()" /><br /> : : function output() { hWin=window.open("childwindow.htm", "test", "width=400,height=400"); hWin.document.op.out.value="MNL"; } 子(childwindow.htm)は : <form name="op"> <textarea name="out"> です。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
試しに・・・ clearTimeout(parent.tid) の行をけずってみてください。 windowが開いた後MNLとかきこまれるのは 一緒ですが、textareaの値を手で書き換えても すぐ上書きされます。 これはsetIntervalが、連続して同じ作業を くりかえすからです。 if(win.document.op.out)でオブジェクトが定義 された時点で、MNLをかきこみ、連続作業を clearTimeoutで「もうやめていいよ」と宣言 しているというフローです
その他の回答 (7)
- chinensis
- ベストアンサー率40% (54/132)
>実は親ウィンドウが最初のプロセスでGoogleMapの地図をダウンロードしているのですね。それで、子ウィンドウが開くのに時間がかかり、うまくいかないようです。 最初に子ウインドウを開き、マップダウンロード後に子ウインドウへ書き込んでは? もしくは別途イベントハンドラ(onFocus,onLoad等)で値を設定するようにするのは?
- yambejp
- ベストアンサー率51% (3827/7415)
まぁこんな感じにすると動いているっぽいのですが ウィンドウが立ちあがらないとループすると言う つくりはあまりよろしくないかもしれませんね。 <input type="button" value="Out" onClick="output()" /><br /> <script language="javascript"> function output(){ hWin=window.open("childwindow.htm", "test", "width=400,height=400"); tid=setInterval("repeatFunc(hWin)",100) } function repeatFunc(win){ if(win.document.op.out){ win.document.op.out.value="MNL" clearTimeout(parent.tid) } } </script>
お礼
具体的なコードありがとうございました。setInterval("repeatFunc(hWin)",100)ではうまくいかなかったので、試しに1000にしてみればOKでした。 結局は、環境によりけりということで、最初のsetTimeoutを使う例よりはマージンを小さくできるということなのでしょうか?
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>この値というのは、例えばインターネットへの接続環境によって違うということでしょうか? >だとすると、どれくらいの値を取るのが普通なのでしょうか? ご推察の通り、接続環境や接続しているサーバーの負荷状況とかによっても違ってくると思います。 どれくらいが適当かというのは一概に言えません、場合によっては10分以上サーバーからレスポンスがないかもしれませんし・・ setTimeout や setInterval を使って 間けつ実行してみてOK(読み込めるようになった)だったら clearTimeout や clearInterval で待ちを解除する とかでやるのかなと思いますが、 あまり長い時間待てる閲覧者もいないでしょうし、 適当な時間でタイムアウトということにしてもいいんじゃないでしょうか。 それは、ページの作成者の考え次第だと思います。
お礼
適当な時間でタイムアウト・・・。 ただ、それでも、子ウィンドウは表示されていて、データがセットされないという結果になるので、サイトの利用者は「あれ?」ってことになっちゃうと思うんですよね。 いっそうのこと、子ウィンドウが表示されなきゃ、あタイムアウトかとわかるとは思うのでしょうけど。
- yambejp
- ベストアンサー率51% (3827/7415)
つまり、オブジェクトが作られる前にセットしよう としているからだめなわけで、ブラウザの busyを見る方法もありますが、ブラウザ依存に なる可能性も有り、総じてウェイトをかける方法が 妥当だという経緯です。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
多分、子ウィンドウが読み込まれ終わっていない時期に値をセットしようとするから失敗しているのだと思います。 少し時間待ちをしてやる必要があります。
お礼
あ、下の方のコードで3000ミリ秒くらいウェイトをかけたら表示されました。 しかし、この値というのは、例えばインターネットへの接続環境によって違うということでしょうか? だとすると、どれくらいの値を取るのが普通なのでしょうか?
- yambejp
- ベストアンサー率51% (3827/7415)
とりあえず以下にしてみてください <input type="button" value="Out" onClick="output()" /><br /> <script language="javascript"> function output(){ hWin=window.open("childwindow.htm", "test", "width=400,height=400"); setTimeout('hWin.document.op.out.value="MNL"',0) } </script>
お礼
すいません、ちなみに一度子ウィンドウが表示されてから、再度(この例ですと)「Out」をクリックすると表示されます。
補足
回答ありがとうございます。 実行してみたのですが、やはり値がセットされません・・(>_<)
--子(childwindow.htm)-- × <form name="op"> <textarea name="out"> ○ <form name="op"> <textarea name="out"></textarea> </form>
補足
あ、すいません。質問する時にちょっと切れちゃって・・・ textarea,formのタグはちゃんと閉じています・・
お礼
ご指摘のとおりclearTimeout(parent.tid)をコメントアウトしましたが、状況はかわらずでした。(上書き後すぐ元の値に戻るというのは確認できましたが。) 実は親ウィンドウが最初のプロセスでGoogleMapの地図をダウンロードしているのですね。それで、子ウィンドウが開くのに時間がかかり、うまくいかないようです。実際は、Mapを表示させてから子ウィンドウを開く使い方が普通だとは思うのですが、100%そうともいえないので苦労しています。