プロが教えるわが家の防犯対策術!

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

A 回答 (8件)

試しに・・・


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

ご指摘のとおりclearTimeout(parent.tid)をコメントアウトしましたが、状況はかわらずでした。(上書き後すぐ元の値に戻るというのは確認できましたが。)

実は親ウィンドウが最初のプロセスでGoogleMapの地図をダウンロードしているのですね。それで、子ウィンドウが開くのに時間がかかり、うまくいかないようです。実際は、Mapを表示させてから子ウィンドウを開く使い方が普通だとは思うのですが、100%そうともいえないので苦労しています。

お礼日時:2006/05/23 09:49

>実は親ウィンドウが最初のプロセスでGoogleMapの地図をダウンロードしているのですね。

それで、子ウィンドウが開くのに時間がかかり、うまくいかないようです。

最初に子ウインドウを開き、マップダウンロード後に子ウインドウへ書き込んでは?

もしくは別途イベントハンドラ(onFocus,onLoad等)で値を設定するようにするのは?
    • good
    • 0

まぁこんな感じにすると動いているっぽいのですが


ウィンドウが立ちあがらないとループすると言う
つくりはあまりよろしくないかもしれませんね。

<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>
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/05/22 15:39

>この値というのは、例えばインターネットへの接続環境によって違うということでしょうか?


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

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

お礼日時:2006/05/22 21:11

つまり、オブジェクトが作られる前にセットしよう


としているからだめなわけで、ブラウザの
busyを見る方法もありますが、ブラウザ依存に
なる可能性も有り、総じてウェイトをかける方法が
妥当だという経緯です。
    • good
    • 0

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


少し時間待ちをしてやる必要があります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/05/21 22:16

とりあえず以下にしてみてください


<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>

この回答への補足

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

補足日時:2006/05/21 22:06
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/05/21 22:13

--子(childwindow.htm)--


×
<form name="op">
<textarea name="out">


<form name="op">
<textarea name="out"></textarea>
</form>

この回答への補足

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

補足日時:2006/05/20 17:59
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!