• ベストアンサー

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"> です。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.7

試しに・・・ clearTimeout(parent.tid) の行をけずってみてください。 windowが開いた後MNLとかきこまれるのは 一緒ですが、textareaの値を手で書き換えても すぐ上書きされます。 これはsetIntervalが、連続して同じ作業を くりかえすからです。 if(win.document.op.out)でオブジェクトが定義 された時点で、MNLをかきこみ、連続作業を clearTimeoutで「もうやめていいよ」と宣言 しているというフローです

masa328
質問者

お礼

ご指摘のとおりclearTimeout(parent.tid)をコメントアウトしましたが、状況はかわらずでした。(上書き後すぐ元の値に戻るというのは確認できましたが。) 実は親ウィンドウが最初のプロセスでGoogleMapの地図をダウンロードしているのですね。それで、子ウィンドウが開くのに時間がかかり、うまくいかないようです。実際は、Mapを表示させてから子ウィンドウを開く使い方が普通だとは思うのですが、100%そうともいえないので苦労しています。

その他の回答 (7)

  • chinensis
  • ベストアンサー率40% (54/132)
回答No.8

>実は親ウィンドウが最初のプロセスでGoogleMapの地図をダウンロードしているのですね。それで、子ウィンドウが開くのに時間がかかり、うまくいかないようです。 最初に子ウインドウを開き、マップダウンロード後に子ウインドウへ書き込んでは? もしくは別途イベントハンドラ(onFocus,onLoad等)で値を設定するようにするのは?

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.6

まぁこんな感じにすると動いているっぽいのですが ウィンドウが立ちあがらないとループすると言う つくりはあまりよろしくないかもしれませんね。 <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>

masa328
質問者

お礼

具体的なコードありがとうございました。setInterval("repeatFunc(hWin)",100)ではうまくいかなかったので、試しに1000にしてみればOKでした。 結局は、環境によりけりということで、最初のsetTimeoutを使う例よりはマージンを小さくできるということなのでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

>この値というのは、例えばインターネットへの接続環境によって違うということでしょうか? >だとすると、どれくらいの値を取るのが普通なのでしょうか? ご推察の通り、接続環境や接続しているサーバーの負荷状況とかによっても違ってくると思います。 どれくらいが適当かというのは一概に言えません、場合によっては10分以上サーバーからレスポンスがないかもしれませんし・・ setTimeout や setInterval を使って 間けつ実行してみてOK(読み込めるようになった)だったら clearTimeout や clearInterval で待ちを解除する とかでやるのかなと思いますが、 あまり長い時間待てる閲覧者もいないでしょうし、 適当な時間でタイムアウトということにしてもいいんじゃないでしょうか。 それは、ページの作成者の考え次第だと思います。

masa328
質問者

お礼

適当な時間でタイムアウト・・・。 ただ、それでも、子ウィンドウは表示されていて、データがセットされないという結果になるので、サイトの利用者は「あれ?」ってことになっちゃうと思うんですよね。 いっそうのこと、子ウィンドウが表示されなきゃ、あタイムアウトかとわかるとは思うのでしょうけど。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

つまり、オブジェクトが作られる前にセットしよう としているからだめなわけで、ブラウザの busyを見る方法もありますが、ブラウザ依存に なる可能性も有り、総じてウェイトをかける方法が 妥当だという経緯です。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

多分、子ウィンドウが読み込まれ終わっていない時期に値をセットしようとするから失敗しているのだと思います。 少し時間待ちをしてやる必要があります。

masa328
質問者

お礼

あ、下の方のコードで3000ミリ秒くらいウェイトをかけたら表示されました。 しかし、この値というのは、例えばインターネットへの接続環境によって違うということでしょうか? だとすると、どれくらいの値を取るのが普通なのでしょうか?

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

とりあえず以下にしてみてください <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>

masa328
質問者

お礼

すいません、ちなみに一度子ウィンドウが表示されてから、再度(この例ですと)「Out」をクリックすると表示されます。

masa328
質問者

補足

回答ありがとうございます。 実行してみたのですが、やはり値がセットされません・・(>_<)

noname#22259
noname#22259
回答No.1

--子(childwindow.htm)-- × <form name="op"> <textarea name="out"> ○ <form name="op"> <textarea name="out"></textarea> </form>

masa328
質問者

補足

あ、すいません。質問する時にちょっと切れちゃって・・・ textarea,formのタグはちゃんと閉じています・・

関連するQ&A