onsubmitの動作について

このQ&Aのポイント
  • formタグのonsubmit属性に指定されたJavaScriptメソッドがフォームの送信処理を制御するが、安定しない場合がある。
  • check()メソッドは実行され、戻り値の判定もされるが、フォームの送信処理は非同期で別途実行されてしまっているため、check()の完了が間に合わなければ送信されてしまうことがある。
  • この問題を回避する簡単な方法は存在しない。
回答を見る
  • ベストアンサー

onsubmitの動作

下記のような formタグがあるとします。 <form action="hoge.php" method="POST" onsubmit="return check();"> JavaScriptメソッド check() が false を返す場合は、 フォームの送信処理を実行しない、という想定をしています。 しかし、実際にやってみると、送信されたりされなかったりと、挙動が安定しません。 check()内部の処理量が多いと勝手に送信される傾向を感じます。 (IE8にて確認しました) そこで質問です。 この例の場合、確かにcheck()は実行され、戻り値の判定もされますが、 フォームの送信処理自体は、非同期で別途実行されてしまっているため、 そこにcheck()の完了が間に合わなければ、送信されてしまう、ということでしょうか。 仮にそうである場合、この問題を回避する簡単な方法は無いでしょうか。 (JavaScript内でPOSTデータをごりごり作って送信、とかは避けたいです)

  • mokpok
  • お礼率62% (154/245)

質問者が選んだベストアンサー

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.2

こんにちは。 その現象が起きたことが無いです。 check()内部でJavaScriptエラーが発生していませんか? (起きたり起きなかったりというところを見ると何か条件に引っかかって実行される部分にエラーがあるとか) JavaScriptエラーが発生するとsubmitが実行されてしまいます。

mokpok
質問者

お礼

回答ありがとうございます。 色々試している内に起きなくなってしまいました。 やっぱりエラーが含まれてただけなのかもしれません。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

たぶんただの書き間違いだと思いますが もうひとつの考え方としては常にcheck()はfalseを返すように作っておき 別途、問題ない場合だけformをsubmit()してやればよいのでは?

mokpok
質問者

お礼

回答ありがとうございます。 色々試している内に起きなくなってしまいました。 やっぱりエラーが含まれてただけなのかもしれません。

  • nmktksk
  • ベストアンサー率36% (75/208)
回答No.1

データを送信するボタン側で処理をしてはいけないのでしょうか?

mokpok
質問者

お礼

回答ありがとうございます。 その選択肢はあるのですが、まずはonsubmitの仕様が明らかになってからと思っていました。

関連するQ&A

  • onSubmit=の後ろは複数可能でしょうか?

    <SCRIPT language=JavaScript><!-- function check() { ・ ・ ・ <FORM action="mailto:××@××.com method="post" enctype="text/plain" name="myform" onSubmit="return Check()"> で未記入のものを確認してアラートを出すようにしています。 この機能にフォーム送信後、指定ページへ移動するようにしたいのですが、それは 可能ですか?となると別ページへの移動は function Start(){ setTimeout('window.location.href="他のページのファイル名.htm"',5000); } // --> </SCRIPT> ・ ・ ・ <FORM action="mailto:××@××" method="post" enctype="text/plain" name="myform" onSubmit="Start()"> になると思うのですが、onSubmit=の後に"return Check()"と "Start()"というのは両方使えるものなのでしょうか?;でつないでも正しく動いてくれません。ページ移動が無理なら、"return Check()"を使う、 sent=0 function Check(){ if(sent==0){ sent=1; return true; }else{ if(confirm("1度送信された可能性があります。")){ return true; }else{ return false; } } } かなと思ったのですが、これだと未記入の場合のアラートが出なくなります。 もう行き詰まってしまいました・・。 解決策をご存知の方、ぜひお願いします!

  • onSubmitで2つの関数を実行したい

    下記のような送信フォームでformCheck()と同時にもう一つ関数を実行させることは可能ですか。その場合にはどのように書けばよろしいでしょうか。 <FORM NAME="myform" ACTION="next.html" METHOD="post" onSubmit="return formCheck()"> これを <FORM NAME="myform" ACTION="next.html" METHOD="post" onSubmit="★ここで2つできる?★">

  • form の onSubmit がコールされません;

    JavaScript初心者のyuki_xです。よろしくお願いします☆ 以下のコードで、 <チェック>を押下したときの動作が上手くいきません。 どうしてなのか、さっぱりわからないので教えてください!! 私の予定では、 1)<チェック>押下 2)nextPage() が呼ばれる 3)nextPage() で onSubmit イベントが発生 4)onSubmit に記述されている check() が呼ばれる となるはずなのですが、onSubmit イベントが発生していないようなのです。 alert() をいれて確認したところ、nextPage() が呼ばれたあと、 FORM の action に書かれている next.html へ移ってしまいます。 check() は呼ばれません。 どこが間違っているでしょうか? <SCRIPT TYPE="text/javascript" LANGUAGE="JavaScript"> <!-- function nextPage() { document.myform.type.value = n; document.myform.submit(); } function check() { //入力チェック } //--> </SCRIPT> <FORM action="next.html" method="post" name="myform" onSubmit="return check()"> <INPUT type="hidden" name="type" value=""> <INPUT type="button" value="チェック" onClick="nextPage();"> </FORM> (IE を使っています。)

  • フォームの送信ボタンが押されたときの処理について

    (1).phpファイルにおいて、下記のようなフォームを作成したときに、 JavaScriptの、onSubmitイベントで、PHPの$pushsubumit 変数に 1を代入したいのですが、echo()した結果、代入されていません。 やはり、JavaScriptの文のなかでPHPスクリプトは通用しないのでしょうか? どのようにすれば、送信ボタンを押したという、PHPの$pushsubmitフラグを 1にできるのでしょうか。 (2)ちなみに、JavaScriptのテキストでは、return 1; という表現を用いていますが、 この戻り値はどこでどうやって受けるのでしょうか。 (3)例えば、onSubmit="var pushsubmit; pushsubmit=1;"などと書いたとして、 このpushsubmit=1をPHPスクリプト側でどうやって受ければいいのかがわかりません。 どうぞよろしくお願いします。 --------------------------------------------------------------------------- (1)<form name="form1" method="post" action="bbs.php" onSubmit="showdlgbox(); <?php $pushsubmit=1 ?>"> <?php ~ ?> (2)<form name="form1" method="post" action="bbs.php" onSubmit="showdlgbox(); return 1;">

    • ベストアンサー
    • PHP
  • onsubmitのこと

    診断テストを作成しているのですが、「診断」をクリックすると下記のことを全部実行したいのですが・・・ (1)点数の計算 (2)点数によって判定Windowが出る (3)テキスト欄の記入もれ確認 (4)cgiを使ってのメール送信 <FORM name="form1" action="***.cgi" mathod="POST" onsubmit="displayScore();returnCheck()"> 上記のことは不可能でしょうか? ひとつのボタンで「診断」「送信」をいっぺんに実行したいのですが・・・ 初心者のため、どうぞよろしくお願いいたします。

  • Javascriptを勉強中でメールフォームを作っているのですが、

    Javascriptを勉強中でメールフォームを作っているのですが、 function check(){ if(document.form1.namae.value==""){ alert("お名前を入力してください。"); return false; } else{ return true; } } で名前が空白の時送信ボタンを押した時に警告メッセージが出るようにしようと思っています。 ボタンには以下のように書いています。 <form name="form1" action="mailto:mail@address" method="post" enctype="text/plain" onsubmit="check()"> そうすると警告は出ますが、処理を続行してメールも送れてしまいます。 教科書を見ると <form name="form1" action="mailto:mail@address" method="post" enctype="text/plain" onsubmit="return check()"> となっているのでそうすると問題ないのですが、なぜreturnを入れないといけないのかよくわかりません。 check()の中ですでにfalseかtrueの値が出ているのでreturnが要らないと思ったのですが・・ 初心者なのでよくわかっていません。 お願いいたします。

  • FormのonsubmitでJavaスクリプトを複数使えますか

    こんにちは。 いまフォームページで送信前に記入漏れがないかチェックするのに、スクリプトを使っています。 <form action="../cgi-bin/form.cgi" method="post" name="bkform" onSubmit="return Check()"> このほかに、スパム防止のためJcapというスクリプト(画像で出てくる文字を入力させる)を使うことにしました。 画面上に表示はできるようになったのですが、こちらのスクリプトも <form method="post" action="/cgi-bin/form.cgi" onSubmit="return jcap();" name="xfrm"> というようにonsubmitが必要です。 この二つのスクリプトを1つのページで動かすことは可能なのでしょうか? ご教授お願いいたします・・・。

  • 複数サーバーにPOSTする場合

    function formsubmit() { document.getElementById('form1').submit(); document.getElementById('form2').submit(); } <form name="form1" method="post" action="Aサーバー"> ~ </form> <form name="form2" method="post" action="Bサーバー"> ~ <button onclick="formsubmit()">送信</button> </form> 以上でA、BサーバーにPOSTした場合ですが 送信後の挙動がよく分かりません、たとえばそれぞれのサーバーでエラーに なった場合や戻り値を取得する場合や、エラーチェックも送信元のサーバーで 取得する方法が分かりません、実際にサンプルで動かしてみましたがAサーバーに POSTされてないようなのですが、Aサーバーが外部サーバーでBサーバーが送信元 であった場合、Aサーバーでの処理はどうしたらいいかイマイチわかりません header("Location:でBサーバーに戻せばいいのでしょうか? よろしくお願いします。

  • $_POST['hoge']のデータをフラッシュするには

    <form method="post" action=""> <input type="text" name="hoge1" value="$_POST['hoge1']"> <input type="text" name="hoge2" value="$_POST['hoge2']"> <input type="submit" value="送信"> </form> データ送信してもフォーム内にデータが残るようにしたのですが、HTMLをこのままにして、PHPの方で$_POST['hoge']の中身を消去したいのですが、どのようにすればいいでしょうか? 記入漏れの時にはそのデータが残り、すべてを記入してデータ送信後は再び何も書かれていない状態にしたいのです。できれば、Javascriptを使わないでやりたいと考えています。よろしくお願い致します。

    • 締切済み
    • PHP
  • パールが実行されない!!

    パールを実行させようとしたのですが、以下のような結果がブラウザで返されてしまいます。 Method Not Allowed The requested method POST is not allowed for the URL /aaa/bbb/ccc/ddd.pl. そこで、元々のHTML内のPOSTをGETに変えてみたところ、今度はddd.plを上記から実行するか、保存するかのダイアログが出てきてしまいます。 <FORM method=POST onsubmit="return check()" action="../../cgi-bin/ddd.pl">               ↓ <FORM method=GET onsubmit="return check()" action="../../cgi-bin/ddd.pl"> サーバー側のパールの設定(パールが動作しない等)なのでしょうか?