新たに呼び出された.asp内に別フレームのデータをsubmitするには

[上に] [前に] [次に]
げげん 2000/02/03(木) 10:48:51
げん、改めげげんです。(あんまり代わってないか)
ところで質問です。
チャペルさんの質問と類似しているかも知れませんが、
これを、見ても良く分からなかったので、もう一度お願いします。

フレームが3つに切ってあるとして、それぞれに.aspファイルが呼び出されて
初期表示されている状態とします。
2フレーム目は、テーブルで2次元配列を作り、そこにデータを入力すると
します。3フレームに実行ボタン等を配置してあります。
3フレーム目の実行ボタンが押下されたら、2フレーム目で入力された
データを1フレーム目に送りたいのですが、なるべくhidden等を使わずに、
submitしたいのです。
しかも、3フレーム目でボタンが押下された場合に1フレーム目に
新たに別の.aspファイルを呼び出すことになっています。
この別の.asp内に2フレーム目のデータを送りたいのです。
何か方法はありますか?
宜しくお願いします。

げげん 2000/02/03(木) 11:49:53
もひとつ、追加です。
1フレーム目のすでに読み込まれているフォームに対して、
2フレーム目のフォームをsubmitすることはできますか?
以下は正しい文ではありませんが、ニュアンスとして捕らえてください。

*2フレーム目のフォームを1フレーム目のターゲットに設定する。
top.frames[1].forms[0].target="gamen1";
*2フレーム目のフォームを設定したターゲットに対して、submitする。
gamen1=top.frames[1].forms[0].submit();

無責任官庁 2000/02/03(木) 11:56:07
テストしてませんが、二つ思い付きました。

(1)2フレーム目の<FORM>タグに、TARGET="1フレーム目"を付けて、
   3フレーム目のボタンの JavaScript で Submit()
   (これはいささか自信がない)

(2)3フレーム目のボタンにJavaScriptを書き、
   1フレーム目の Location に、GETで2フレーム目のデータを送信する。
   parent.1フレーム目.location.href=ASPのアドレス+"?"+2フレーム目のパラーメータ

すいません。追加の部分は理解できませんでした。
上記の(2)で、後ろに1フレーム目のパメータをくっつけたらよいとか…
そういう事ではないですかね?

無責任官庁 2000/02/03(木) 11:57:55
すみません。言葉が変ですね(笑)
パラーメータ→パラメータ
パメータ→パラメータ
手がかじかんで…(謎)

げげん 2000/02/03(木) 13:04:34
まいど、無責任官庁さんありがとうございます。
実は2フレーム目の呼び元.aspは、入力して1フレーム目に情報が渡って、
チェックを走った後に再度2フレーム目に表示するため、固定でターゲットを
指定できないのでした。(すみません。)
で、1の方法は今後の参考に・・・ということで。
2の方法は、2フレーム目のパラーメータの部分は
1つ1つ指定しないとだめですかね?
例えば、行7列19の2次元配列で、各<TD></TD>の中に<INPUT TYPE='text'〜>とか
<SELECT></SELECT>が貼ってある場合、NAMEは「固定文字」+カウンタで指定しているのですが、
これを、全部書かないといけないですか?
〜.location.href="ASPのアドレス
+?txt11=" + 引数(1,1) + "&sel12=" + 引数(1,2) + "〜&txt718=" + 引数(7,18) + "&sel719=" + 引数(7,19) + "";
みたいに。

あと、追加は究極的に言ってしまえば、
top.frames[0].forms[0].???=top.frames[1].forms[0].submit();
みたいなことはできますかってことなんですけど。
1フレーム目のフォーム全体に2フレーム目のフォーム全体を
コピーするみたいなことかな?
とんでもないことを、質問しているような気もしますが、
良く分かっていないので、許してくださいませ。

無責任官庁 2000/02/03(木) 14:03:37
えーと、再びテスト無し情報ですみません(ちょっと忙しいので)

addr = "ASPアドレス" + "?";
itemlength = parent.フレーム.document.フォーム.elements.length;
for(loop = 0;loop < itemlength;loop++){
itemtype = parent.フレーム.document.フォーム.elements[loop].type;
if(itemtype=テキスト){
itemdata = parent.フレーム.document.フォーム.elements[loop].value;
itemname = parent.フレーム.document.フォーム.elements[loop].name;
addr = addr + itemname + "=" + itemdata + "&";
}
if(itemtype=セレクト){
itemselect = parent.フレーム.document.フォーム.elements[loop].selectedIndex;
itemdata = parent.フレーム.document.フォーム.elements[loop].options[itemselect].value;
itemname = parent.フレーム.document.フォーム.elements[loop].name;
addr = addr + itemname + "=" + itemdata + "&";
}
以下続く・・・
}

こんな感じだと、何にでも対応できると思います。
フォームのレイアウトを変更してもプログラムは変えずに済むでしょう。
ただ文法にいまいち自信がないので、リファレンスを参照しながらどうぞ(汗)
なお、上記サンプルは IE3 は不可なので注意です。
あとすみません。elements.type は使った事が無いので値が分かりません。
多分、type= の中身が入っていると思います。
(SELECT は、"select"とか入ってるのかな?alert()とかで出してみてください)

あと、value に2バイト文字があると単純に足すだけじゃまずい気がします。
(いいのかな?確か過去にそういう話題があったような)
もし日本語使うようなら、ここのラウンジを検索してみてください。

>1フレーム目のフォーム全体に2フレーム目のフォーム全体を
>コピーするみたいなことかな?

すみません。誰か助けてください(汗)
私はオブジェクトの理念をいまいち理解してないもんで・・・

げげん 2000/02/03(木) 15:17:40
[[解決]]
こおんな感じで作って動作しました。OKでした。
たぶん無責任官庁さんの言ってることも同じだと思います。
(ちゃんと仕様を書かなかったので、テキストとかセレクトとかよく
わからなかったですよね・・・単純にelementsを取りたかっただけの
ようでした。済みません。)
お忙しいところ、ありがとうございました。

  function entrp() {
    var tcnt,cnt;
    var wstr="";

    //フレーム2のテーブルデータの先頭に位置づける
    for(tcnt=0;tcnt<top.frames[2].document.fm.elements.length;tcnt++) {
      if (top.frames[2].document.fm.elements[tcnt].name=="先頭elementの名称") {
        break;
      }
    }

    //変数にデータを格納する
    for (cnt=0;cnt<(top.frames[2].document.fm.elements.length-tcnt);cnt++) {
      wstr=wstr+"&" + top.frames[2].document.fm.elements[tcnt+cnt].name + "=";
      if (top.frames[2].document.fm.elements[tcnt+cnt].value.length==0) {
        //何も入力されなかったら
        wstr=wstr+"emp";
      }
      else {
        //何か入力されたら
        wstr=wstr+top.frames[2].document.fm.elements[tcnt+cnt].value;
      }
    }

    top.frames[1].location.href="gen.asp?mesi=M" + wstr;
    return false;
  }

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