別ウィンドウから元ウィンドウに記述されているJava Scriptにアクセスするには?
[上に]
[前に]
[次に]
りょう
[E-Mail]
2000/01/13(木) 13:01:17
こんにちは!
新たに開いた別ウィンドウから元ウィンドウのHTMLに記述されているJava Script関数と変数にアクセスするwことは可能でしょうか?このような感じなのですが...
windowA
--------------------------------------
<Frame1>
isFree=false;
checkFlag(){...}
--------------------------------------
<Frame2>
・ここからwindowAのFrame1の変数と関数を利用
・このフレームのアンカーをクリックすると
windowBが開く
--------------------------------------
windowB
--------------------------------------
・ここからもwindowAのFrame1の変数と関数を利用
--------------------------------------
この2つのウィンドウで発生するイベントを制御するためなのですが、Frame2からはアクセスできるものの、windowBからはアクセスできません。
opener.parent.Frame1.checkFlag()
でいけないかと思ったのですが、ダメでした。
もしご存知の方がいらっしゃいましたら、どうかご教授ください。よろしくお願いします。
Mugi
[E-Mail]
[HomePage]
2000/01/13(木) 16:46:13
WindowBはアンカーで開いているということですが、もしかして、<a href=.. target=..> を使っていませんか?
この方法で開かれたウィンドウにopenerはありません。
window.open()で開かれたウィンドウでなら、openerが使えます。
例えば、<a href="" onclick="window.open('Bのファイル名');return false"> のように。
りょう
[E-Mail]
2000/01/13(木) 21:28:43
Mugiさんご回答ありがとうございます。JavaScriptの細かい解説書を持って
おらず、このホームページのQ&Aを見よう見まねでやっていたものでopener
の意味を正確にわかっておりませんでした(^^;)。
でも試したのですが、なかなかうまくいきません。あともう1つ悩みどころ
として、「アンカーをクリックしてsubmit()したデータを、新規に開いた
ウィンドウで利用する」という仕様を抱えています。
具体的には
1. テーブルのセルに記述されているアンカーがクリックされると、
ある値を隠しフィールド(仮にhiddenA)に設定
isFreeをtrueに(でも、onSubmitのcheckStatus()が呼ばれない....)
2. submit()
3. actionとしては、hiddenAとisFreeを参照するサーブレットが実行される
4. 新しいウィンドウにその結果を出力(以降、アンカークリック時にこのウィンドウは
使いまわされる)
----windowA Frame1のスクリプト----
isFree=false;
function checkStatus(){
if( !isFree ){
window.alert("検索実行中です。しばらくお待ち下さい");
return false;
}else{
isFree = false;
scrlMsg("wait");
return true;
}
}
function resetStatus(){
isFree = true;
scrlMsg("done");
}
----windowB Frame2で記述のHTML----
<FORM name='moveForm' method='POST' onSubmit='return parent.Frame1.checkStatus()'>
<INPUT type='hidden' name='hiddenA' value=''>
</FORM>
<TABLE>
<TR>
<TD><A href='#'
onClick="moveForm.hiddenA.value='xxxxx';
moveForm.action='MyServlet';
moveForm.target='windowB'; <---ここをかわりにwindow.open('URL', 'windowB')にしてもだめ
moveForm.submit();" > XXXXXXX
</A></TD>
<TR>
<TABLE>
----MyServletのwindowBへの出力文----
out.println( "<BODY onLoad='opener.parent.Frame1.resetStatus()'>" );
うまく説明できませんが、
・アンカーだとonSubmitが呼ばれない(?)
・アンカーのonClickでwindow.openしてもopenerはundefinedのまま(?)
・window.openだと、submit()のデータがそのウィンドウに送信されない(?)
等々、あちこちでこけているようです(おまけにポカもやっているかも...)。
どれか一点でもいいのでどうか思い当たる方、助言よろしくお願いします。
Mugi
[E-Mail]
[HomePage]
2000/01/13(木) 21:43:00
他は後回しにしてまず一個所指摘。
opnenerは「新しく開かれたウィンドウ」に対するウィンドウ作成元を示すものなので、
このように、指定した名前のウィンドウ(=フレーム)が存在する場合は
そのwindowオブジェクトを参照するだけなので、新しいウィンドウは開かれていません。
だから、undefinedになります。
もうわかると思いますが、formのターゲットとなる新しいウィンドウを開くとき、
window.open()のウィンドウ名に、別の名前を指定する必要があります。
今から他の問題も修正して、サンプルを作ります。
Mugi
[E-Mail]
[HomePage]
2000/01/13(木) 22:24:20
いまファイル作っていたのですが、isFreeをtrueにするタイミングがわかりません。
> 1.
> isFreeをtrue
これを読むとsubmit前にtrueにするようにとれますが、これだと
falseになることがないですよね?
どういう動作が目標か、もう少し詳しく知りたいです。
# ここから先はメールでやりとりしませんか?
りょう
[E-Mail]
2000/01/14(金) 10:41:39
Mugiさん、重ね重ね恐縮です。
>もうわかると思いますが、formのターゲットとなる新しいウィンドウ
>を開くとき、window.open()のウィンドウ名に、別の名前を指定する
>必要があります。
ごめんなさい。いまいち理解できませんでした。一応、submit元のウィ
ンドウには名前をつけていませんが、新たに開くウィンドウには
'windowB'と名前をつけたつもりだったのですが....。
># ここから先はメールでやりとりしませんか?
はい。ご迷惑でなければどうかよろしくお願いします。後でMugiさん
に直接、もう少し詳しい目標動作を連絡させていただきます。
掲示版には後日解決したら、結果報告するということで...。
Mugi
[E-Mail]
[HomePage]
2000/01/16(日) 08:49:08
連絡がないですが、送信部分だけはできているのでアップしました。
isFreeの変更タイミングがわからないので常にtrueにしています。
http://hp.vector.co.jp/authors/VA013453/js/000113/frame.htm
りょう
[E-Mail]
2000/01/17(月) 12:15:35
[[解決]]
もう少しちゃんとJavaScriptを学んでポイントを絞ってから....
と思っていたら土日過ぎてしまいました。ご連絡遅れまして
本当にすみません。
isFreeをtrueにするタイミングなのですが、実はFrame1にもsubmit
ボタンが2つ、Frame2にもアンカーの他にページングするsubmitボタ
ンがさらに2つあります。これらの送信が発生すると、それぞれが
分散しているC++サーバにアクセスしにいくため、平行して発生しな
いよう、今回のような制御が必要だったのです。
でもあの教えていただいたサンプルは、パーフェクトでした!!
私もあれからあがいていたのですが、window.openの第一引数に
ダミーURLを指定していたためにウィンドウが2つあがってしまい
だめだったようです。あのように省略することも可能なのですね。
Mugiさん、今回は本当にご親切にありがとうございました。
[上に]
[前に]
[次に]