• 締切済み

関数を順番に呼び出したい

一度、ここで質問をしたのですが、わたくしの勘違いで質問締め切ってしましました。 再度の投稿をお許しください。 関数test()の中で、関数testA 、関数testBの順番で呼び出したいと思っています。 関数testAで、return true;を入て、if文でtestAがtrueだったらtestBを呼ぶという処理を行う場合、どこにreturn testを入れたらよいのか迷っています。 またtestAの最後にtestBを入れる場合は、submit()の前も後もどちらに書いても呼ばれないですよね。 ちなみに、testA,testBは以下のような感じです。 testA(){ action="××update××"; method="post"; target="FRAMEH"; submit(); } testB(){ action="××insert××"; method="post"; target="FRAMEH"; submit(); }

みんなの回答

  • arexis
  • ベストアンサー率66% (66/99)
回答No.6

こんにちは。 駄目だったんですね^^; 各処理の最後がsubmit()だったんですか。 JSPとか絡んでくると私にはわからない範囲になっちゃいますが 単純にJavaScriptの話としてなら 1つのHTMLフォームの内容をJavaScriptでselfウィンドウではなく、 他のフレームに対して2回別々に送信して処理をさせる。 selfウィンドウは書き換えないと言うなら。 単に送信内容をコピーしておけば良いだけだと思うのですが、 test(){ var el_values = []; /* ここでフォームのelements配列をループ処理して値を el_value に保存 */ if( testA() ){ /* ここでel_values配列の値をフォームに戻す */ testB() } } testA関数では submit()の後に return trueで。 こんな単純な話とは全然違うのかな? 的はずれてたらすみません^^;

HAWAI777
質問者

お礼

ありがとうございました。 勉強になりました。

回答No.5

問題は submit()がアクセス先のWebページから返答があって、 ページが読み込まれる前に終了してしまうということにあると思います。 で、自分なら次のようにします。 まずiframeをHTMLに追加します。 これは裏側で使うものなので、スタイルシートなどで見えないようにします。 また、name/idを設定するとともにonLoadを定義します。 <iframe name="hidden_frame" id="hidden_frame" style="display: none; visibility: hidden;" onLoad="onFrameLoad();"></iframe> のような感じです。 その上でtest()をtestAのみを実行する関数に変更し、 それを呼び出すフォームのtargetが今はFRAMEHになっていますが、それに上で作成したiframeのnameを指定します。 最後に上で作成したiframeのonLoadに指定した関数の中でtestBを呼び出す様にします。(直接onLoadにtestBを指定しても構いません) 多分、もともとのtestBだとsubmit()対象のformが分からないので、どのformをsubmitするか分かる様、 formにidを振って var form = document.getElementById('formのID'); form.action="××insert××"; form.method="post"; form.target="FRAMEH"; form.submit(); のようにする必要があるかと思います。 自分は手っ取り早くこういうことをしたい場合は、 iframeが好きなので上のようにしますが、 AJAXでページ読み込み終了を判定する方法はいろいろあると思うので たとえば「AJAX 読込 終了 判定」などで検索してみると良いと思います。

  • HIRSYU
  • ベストアンサー率51% (45/87)
回答No.4

submitの動きを要約すると、 「submit実行」→「サーバー処理」→「サーバーがHTMLを返す」→「ブラウザがページを更新」 となり、“submitが正常に完了=ページ更新される(処理中のJavaScriptも中断)”です 実際の仕様などがわからないので、なんとなくですが、クライアント側で制御するのではなく、サーバー側でやるべきだと思います。 クライアント側で制御したいのであれば、AJaxの非同期通信あたりを勉強してください。 (submitではなく、XMLHttpRequestやActiveXObject("Msxml2.XMLHTTP.6.0")を使って送信する)

  • auty
  • ベストアンサー率58% (284/486)
回答No.3

>>> testBのactionしかsubmitされていないのではないでしょうか。 その通りです。 submitとはなんでしょうか。 前回書いたように <<< 関数testA()でsubmitしたら、それで関数test()は終わるはずです。 という具合に私は解釈しております。 一度のクリックで続けて2回submitはできないと考えています。 いかがでしょうか。 と書いたところで、もう1度最初の文を確認しますと、どうやらサーバに1度アクセスした結果に基づいて、 自動的にもう一度サーバに1度アクセスしたようですね。 私には、1度目の結果を見て別のクリックをすることしか思い当たりません。 残念ながらギブアップです。

  • auty
  • ベストアンサー率58% (284/486)
回答No.2

>>> この方法でやってみましたが、testA()がsubmitされないようです。 この意味がはっきりしませんが、testA()が実行されないということでしょうか。その場合は、alert("A");等を関数testA()に入れることで確認できます。 ----------------------------------------------------- testA(){ alert("A"); action="××update××"; method="post"; target="FRAMEH"; if(送信するときの条件){ return true; } else { return false; } } ----------------------------------------------------- これは、関数test()の    f(testA()){ のところで実行されます。 もし、関数testA()でsubmitしたら、それで関数test()は終わるはずです。つまり、関数testB()には行かないことになります。 行っていることのもう少し詳しい状況を、出来るだけ正確にお知らせください。

HAWAI777
質問者

補足

testAは実行されています。 やりたいことは、testAでもtestBでもsubmitしたいのです。 教えていただいた方法ですと、testAの関数が実行されて、次に testBが実行されて、最後にformで実行しますが、testBのactionしか submitされていないのではないでしょうか。

  • auty
  • ベストアンサー率58% (284/486)
回答No.1

次の点を仮定します。 ------------------------------------------------------------- ・ フォームの名前が"myForm"となっている。 ・ フォームから関数test()が呼び出される。 ・ 送信するときの条件は、関数testA()のみで行える。 ・ 関数testB()では、チェックする必要が無い。   (もし必要なら方法は関数testA()と同様です。) ------------------------------------------------------------- そのとき、 ------------------------------------------------------------- 1.関数testA(),testB()のsubmit();は付けてはいけません。 2.関数test()の //...は、処理があれば記入します。 3.関数testA()の「送信するときの条件」をきちんと記入してください。 ------------------------------------------------------------- test(){ //... if(testA()){ testB(); } else { return false; } //... document.myForm.submit(); } testA(){ action="××update××"; method="post"; target="FRAMEH"; if(送信するときの条件){ return true; } else { return false; } } testB(){ action="××insert××"; method="post"; target="FRAMEH"; }

HAWAI777
質問者

補足

ありがとうございます。 この方法でやってみましたが、testA()がsubmitされないようです。

関連するQ&A