【最大10000ポイント】当たる!!質問投稿キャンペーン!

一度、ここで質問をしたのですが、わたくしの勘違いで質問締め切ってしましました。
再度の投稿をお許しください。

関数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();
}

このQ&Aに関連する最新のQ&A

A 回答 (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で。

こんな単純な話とは全然違うのかな?
的はずれてたらすみません^^;
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/02/22 15:48

問題は


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 読込 終了 判定」などで検索してみると良いと思います。
    • good
    • 0

submitの動きを要約すると、


「submit実行」→「サーバー処理」→「サーバーがHTMLを返す」→「ブラウザがページを更新」
となり、“submitが正常に完了=ページ更新される(処理中のJavaScriptも中断)”です


実際の仕様などがわからないので、なんとなくですが、クライアント側で制御するのではなく、サーバー側でやるべきだと思います。

クライアント側で制御したいのであれば、AJaxの非同期通信あたりを勉強してください。
(submitではなく、XMLHttpRequestやActiveXObject("Msxml2.XMLHTTP.6.0")を使って送信する)
    • good
    • 0

>>> testBのactionしかsubmitされていないのではないでしょうか。



その通りです。

submitとはなんでしょうか。
前回書いたように

<<< 関数testA()でsubmitしたら、それで関数test()は終わるはずです。

という具合に私は解釈しております。

一度のクリックで続けて2回submitはできないと考えています。
いかがでしょうか。

と書いたところで、もう1度最初の文を確認しますと、どうやらサーバに1度アクセスした結果に基づいて、
自動的にもう一度サーバに1度アクセスしたようですね。

私には、1度目の結果を見て別のクリックをすることしか思い当たりません。
残念ながらギブアップです。
    • good
    • 0

>>> この方法でやってみましたが、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()には行かないことになります。

行っていることのもう少し詳しい状況を、出来るだけ正確にお知らせください。

この回答への補足

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

補足日時:2008/02/21 14:34
    • good
    • 0

次の点を仮定します。


-------------------------------------------------------------
・ フォームの名前が"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";
}

この回答への補足

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

補足日時:2008/02/21 13:55
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QonClickに複数の関数を挿入する方法

初心者なのですがアニメーションの関数anime1、anime2、anime3を作成し、onClickに下記のように設定しました。
クリックするとアニメーション2つの設定ではは動くのですが、3つ目を設定すると動かなくなります。
通常はこのような設定はしないものなのでしょうか?
教えてください。
よろしくお願いします。
<INPUT type="button" value="START" onClick="anime1(), anime2()">・・・OKです。
<INPUT type="button" value="START" onClick="anime1(), anime2(),anime3()">・・・動きません。

Aベストアンサー

セミコロンでつなぐのが常道ですが、3つ以上なら
別途function化したほうが、可読性が高くなると
思います。

Qfunctionから別のfunctionを実行したい

よろしくお願いします

今JavaScriptで
function a(){
処理A
}
function b(){
処理B
}
function c(){
処理C
処理Aをして終わり
}
と言うことをしたいのですが

function a と同じコードをcに書くのが大変なので
function cからaを呼び出して実行することができないかと考えています

検索も色々してみたのですが
これと言った答えがなかったので質問しました
よろしくお願いします。

Aベストアンサー

他の箇所から、function a()をコールするときと同様に、function c()内でfunction a()をコールすることができます。

function c()
{
処理C
a();
}

Qonclickで2個指定するには?

例えば、下記のような二つの指定があるします。

function checkd1(){
document.FORM.CHECK1.checked=true
}
function checkd2(){
document.write("テスト");
}

これをonclickで二つとも指定するということはできるのでしょうか?

<a href="#" onclick="checkd1()">ボタン</a>
<a href="#" onclick="checkd2()">ボタン2</a>

を<a href="#" onclick="checkd1(),checkd2()">ボタン</a>としても動いてくれないので、書き直すのではなく、このまま二つを指定したいのですが、どうすればよいのでしょうか?

Aベストアンサー

><a href="#" onclick="checkd1(),checkd2()">ボタン</a>

<a href="#" onclick="checkd1();checkd2()">ボタン</a>

おしいですね。
, ではなく ; なら両方の関数が呼ばれると思います。
(Firefox3とIE6で確認しました。)

なぜ ; かと言うと、
Javascriptの文法で、文の区切りは ; だからですね。

QonClickとsubmitの処理順序

#過去ログをあたりましたが、自分で納得いく解答がなかったので質問します。

フォームのsubmitボタンにonClickでチェッカーなどの関数を与えた場合、
submitでフォーム内容を送信するのと、onClickで指定されている関数の
どちらが先に処理されるのでしょうか。
(一応、WindowsのIE、ネスケ共々、onClickの処理の後、submitされるようではあります)

function tasikame {
(フォームの内容チェック/中略)
alert("入力されていない項目があります")
}

例えば、このような関数をonClickで起動する場合、フォームに入力されていない
項目があると、警告されます。
この時、submitはどの環境でも起動しないで終わるのでしょうか。
それとも警告が起動した後、フォーム内容はsubmitされてしまうのでしょうか。

#分かりづらければ、補足しますのでどうぞよろしく。

Aベストアンサー

> 例えば、このような関数をonClickで起動する場合、フォームに入力されていない
> 項目があると、警告されます。
> この時、submitはどの環境でも起動しないで終わるのでしょうか。
> それとも警告が起動した後、フォーム内容はsubmitされてしまうのでしょうか。

この関数の書き方だと、警告のメッセージボックスが表示され、OK を押すと、フォームの
内容は submit されます。

イベントハンドラでは、false を返すことで、本来の動作をキャンセルすることができます。
ですから、期待する(であろう)動作をするためには、

function tasikame {
 //フォームの内容チェック
  ...

 if ( フォームの内容が正しくなければ ) {
  alert("入力されていない項目があります");
  return false;
 } else {
  return true;
 }
}

というような書き方になります。

QJavaScriptで文字列の特定文字以降を取得する方法

変数 url に以下のような文字列が代入されています。
var url='http://www.example.com?id=2&page=3';

ここから?以降の文字列だけを取得したいのですが、どのようにすれば良いのでしょうか?
「id=2&page=3」←このような結果が欲しいです。

ブラウザのurlから直接?以降を取得するには location.search を使えば良いというのは調べてわかりましたが、変数に文字列としてurlが代入された場合の方法がわかりません。

ご回答よろしくお願いいたします。

Aベストアンサー

文字列から抽出するのであれば、indexOfを使うか正規表現かでしょうね
深く考えなければ前者、複雑なデータを取りたいなら後者でしょうか

<script>
var url='http://www.example.com?id=2&page=3';
if(url.indexOf("?")>=0){
var str1=url.substring(url.indexOf("?")+1,url.length);
}
document.write(str1+"<br>");

var reg=new RegExp("\\?(.+?)$");
if(url.match(reg)){
var str2=url.match(reg)[1];
}
document.write(str2);
</script>


人気Q&Aランキング