フレーム間で 値を参照したい

[上に] [前に] [次に]
omi [E-Mail] 1999/08/18(水) 12:36:29
フレーム FA の hoge.htm は
<FORM name='F1'>
<INPUT name='N1' type=text value='99'>
で値を設定していて、
フレーム FQ で、
xx = top.FA.document.F1.N1.value;
の様に参照しているのですが、
フレーム FA  が、fuga.htm になると、そこには F1 も N1 もないので
エラー:'top.FA.document.F1.N1'はオブジェクトではありません。 となります。
そこで、
if ( top.FA.location.href.indexOf('hoge') >0 ){
xx = top.FA.document.F1.N1.value;
}
で、誤魔化そうとするのですが、
hoge.htm があって <INPUT name='N1' がない、タイミングがあるらしく
思うように動きません。
alert( top.FA.location.href ) で表示しようとすると、null で、おまけに
[OK] の文字も消えてしまいます。 windows98 + iE5

top.FA.exist.F1.N1 みたいな"存在するフラグ"があるといいのですが。
よろしく、お願いいたします。

ばーばぱぱ 1999/08/18(水) 12:55:33
FRAMESETで、それぞれのFrameにnameを設定して
topの部分をparent.FrameNameにしたらどうですか?

Tmb 1999/08/18(水) 15:20:11
IE4以上での閲覧に限定していいなら,document.readyStateってのが使えたと思います。

それが駄目なら
>hoge.htmがあって<INPUT name="N1"がない
これが読み込みの途中で起きてしまう現象なら,条件式に
top.FA.document.forms.length> (適当な数)
を付け加えてみるとか,さらにif中にelements.lengthも加えて
さらに厳しくチェックするとか。

でも
>alert(top.FA.location.href)がnull
が原因なのであれば条件式にもtop.FA.location.href != nullが必要でしょうね。

Tmb 1999/08/18(水) 16:02:34
これなんか割と正攻法かな? あんましエレガントではないけど。

function exist(tgFrame,formName,elementName){
retValue=false;
for(i=0 ; i<tgFrame.document.forms.length; i++){
 if(tgFrame.document.forms[i].name == formName){
  for(j=0 ; j<tgFrame.document.forms[i].elements.length; j++){
   if(tgFrame.document.forms[i].elements[j].name == elementName){
    retValue=true;
   }
  }
 }
}
return retValue
}

if (exist(top.FA,'F1','N1')) の形で使用。

Tmb 1999/08/18(水) 16:21:54
割と正攻法第2弾

function exist(tgFrame,formName,elementName){
retValue=false;
 if (typeof(tgFrame.document.forms[formName]) != 'undefined') {
  if (typeof(tgFrame.document.forms[formName].elements[elementName]) != 'undefined') {
   retValue=true;
  }
 }
return retValue
}

これくらいの長さなら,別に関数にしなくても使いやすいのではないかと。
一応Mac+NN3で動作確認してますが,forms[].elementsをifの中に置くことで
ifが成り立たないときに解釈されないことを前提にエラー回避させてるものなので,
ブラウザによって,もし先に構文をすべて解釈してしまうものがあれば,使えない
かもしれません。

Tmb 1999/08/18(水) 16:59:34
ありゃ! もしかして・・・と思ったら
if (typeof(top.FA.document.F1.N1)=='object'){
が使えるじゃないですか(Mac+NN3)

エラーメッセージから言ってもこれがいちばん正攻法だった・・・。

たこすけ 1999/08/19(木) 09:40:17
ん〜と
if(top.FA.document.F1.N1){
だけじゃ駄目ですか?

じゃあfuga.htmにhidden置くのは無しですか?

Tmb 1999/08/19(木) 11:33:25
> if(top.FA.document.F1.N1){
> だけじゃ駄目ですか?

そうか,その手もあるんだ。
でも個人的にはifの条件式がbooleanでないのって,何かしっくりこない (^^;

たこすけ 1999/08/19(木) 14:54:45
> でも個人的にはifの条件式がbooleanでないのって,何かしっくりこない (^^;

if(document.images)とかif(document.layers)は
とほほさんも紹介してるテクニックなんで私は特に違和感ないんですが・・・

if(!!top.FA.document.F1.N1){
こう書けばbooleanになりますが
否定の否定なので、やっぱりしっくりこない・・・う〜む。

if(top.FA.document.F1.N1 != undefined){
はNN3やIEじゃ使えないから
if(top.FA.document.F1.N1 != null){
と書けばいいんだろうけど、(個人的に)嫌だなコレ (^^;

omi 1999/08/20(金) 17:37:25
[[解決]]
ご返事がおくれて、失礼しています。
ブラウザによって、ずいぶん異なってますね。
悲しいかな、windows98+iE5 は、top.FA.document.F1.N1 を見ただけで
処理がどうであっても、"オブジェクトではありません。"となります。
あきらめます。

Tmb 1999/08/20(金) 18:12:10
top.FA.document.forms['F1'].elements['N1'] で扱ってみては?
これならどうみてもオブジェクトなので。
#配列が存在しないとか言われるかもしれないけど,構文的にはあってる
#はずだから回避できるかも。

それで駄目なら,上に挙げた「正攻法」の最初の奴で,retValueをbooleanでなくし,
retValue=trueの代わりにtgFrame.document.forms[i].elements[j].valueを帰させる
とかどうでしょう?
#一回きりの処理なら別関数にせずに記述すればいいだろうし。
#最初にダミー文字列を入れといて,存在しないときにはそれを帰すとか。

omi 1999/08/21(土) 07:25:13
うまく動き出しました。Tmb さん、ありがとうございます。

フレーム FA に フォーム MN がない場合、
x= top.FA.document.forms['F1'].elements['N1'];は
'top.FA.document.forms.F1.elements' はオブジェクトではありません。
となります。
ところが、
x= top.FA.document.forms['F1']; は
undefined か [object] の値を返してきて、エラーになりません。
したがって、
if ( typeof(top.FA.document.forms['F1'])=='object'){
top.FA.document.F1.N1.value ='abc';
}
も有効になりました。ばんざーい \(^o^)/
テストは、windows98+iE5 だけですが、NN46 でも大きな問題はないでしょう。

"割と正攻法第2弾"は、汎用で使えます。よね。
応用し切れなかった私が情けないです。 うーん。

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