別ウィンドウから元ウィンドウに記述されている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さん、今回は本当にご親切にありがとうございました。

[上に] [前に] [次に]