• ベストアンサー

onClickで関数呼出し後に、結果に応じてsubmitを実行する方法

JavaScriptで、 function func() {  if (a==0) {   alert("処理しない");   return false;  }  return true; } と、a=0ならfalseを返し、それ以外ならtrueを返す関数を定義しています。 そして、FORMタグで <FORM NAME="FormName" ACTION="next.html"> <INPUT TYPE="button" VALUE="next" NAME="button1" onClick="return func();submit();"> </FORM> と記述しています。 要は、ボタンを押下した際にfunc関数がtrueを返せば、next.htmlに 遷移させたいのですが、上記記述では、遷移しません・・・ onClick部分にonClick="return func(),submit();"と記述した場合、 func関数の実行結果がtrueでもfalseでも遷移してしまいます。 そこで、なんとなくonClick="return func()&&submit();"と記述してみたところ、 func関数がtrueの時のみうまく遷移するようになりました。 これは偶然そう動作しているのでしょうか、それとも上記は正しい記述方法なのでしょうか? 正しい記述方法ならいいのですが、上記以外に正式な記述方法があれば 教えていただけないでしょうか? ※TYPE="submit"にすればいいとは思うのですが、buttonで実現したいと 考えております。

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

  • ベストアンサー
noname#3852
noname#3852
回答No.2

3つのパターンをみる限り、理由は以下の通りと思います。 1.セミコロン(;)で区切った場合、 この場合、「return func();」と「submit();」とは別の文です。returnはその時点の値を戻して、それ以降の動作を打ち切ってしまいます。よって、onClickイベントはfuncメソッドの戻り値(true/false関係なく)を戻して、そこで終了、それ以降のsubmitは実行しないとなります。 2.カンマ(,)で区切った場合、 この場合、「return func(),submit();」が1つの文となります。この「,」は、左右の式を評価して、右式を結果とする演算子です。よって、funcメソッド、submitメソッド両方を評価するため、funcメソッドの戻り値に関係なく、submitされます。 3.&&で区切った場合、 論理演算子「&&」は、左右ともにtrue(0以外)の場合のみtrueとする演算子です。また、2項論理演算子は左式から評価し、左式だけで全体の結果がわかる場合、右式を評価しません。よって、funcメソッドがfalseを戻した場合、その時点でsubmitを評価しなくても演算結果は必ずfalseとなるのでそこで打ち切られ、trueを戻した場合、submitを評価しないと演算結果を得られないため、遷移したわけです。「&&」を「||(論理和)」に変更すると逆の結果得たと思います。 さて、では3の「&&」が正しいかと言われたら、文法上は正しいです。ただし、他人がみてわかるとは思えません。 そこで、以下の記述はいかがでしょう。読んでみてソースを理解できますか。 <FORM NAME="FormName" ACTION="next.html"> <INPUT TYPE="button" VALUE="next" NAME="button1" onClick="func()"> </FORM> (中略) // funcの定義 function func() {  if (a==0) {   alert("処理しない");   return ;  }  document.FormName.submit(); } 要は、ボタンを押されたら、funcを呼び出せ。 funcでは、aが0ならば、そこで終了しろ。 そうでなければ、documentオブジェクト内のFormNameと言う名前のオブジェクトのsubmitメソッドを呼べ。 です。

schpeltor
質問者

お礼

詳細な解説ありがとうございます。 3パターンそれぞれの動作理由が理解できました。 別の実現方法ですが、関数内でsubmit()を実行させてやればいいわけですね。 恥ずかしながら、思いつきませんでした・・・ 本当にありがとうございました。

その他の回答 (1)

  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.1

>func()&&submit(); おお、この記述方は「しゃれ」てますね。 && は左側がfalseの時は、右を評価(実行)しないので、&&がtrueの時だけsubmit()を実行するわけですね。 いいんじゃないでしょうか。

schpeltor
質問者

お礼

実はなにも考えずに&&と記述していたのですが、 なぜ動作していたかが理解できました。 ありがとうございました。

関連するQ&A

  • submit関数の使い方

    javascript部分 function sendform(formname){ document.formname.submit(); } html部分 <form action="test.html" method="post" name="form1"> <input type="text" name="textvalue" value="1"> </form> <a href="javascript:void(0)" onclick="sendform('form1'); return false;">click1</a> <form action="test.html" method="post" name="form2"> <input type="text" name="textvalue" value="2"> </form> <a href="javascript:void(0)" onclick="sendform('form2'); return false;">click2</a> 今は、上記のように書いています。引数でフォーム名を渡し、その値によって送信フォームを変えたいのですがうまくいきません。if文を使って if(formmei=="form1"){ document.form1.submit(); }else if(formmei=="form1"){ document.form2.submit(); } という方法も考えたのですが、フォーム名だけ変えることができないかと考えています。 よろしくお願いします。

  • クリックした時にsubmitを実行する場合の記述方法について

    過去の質問を見させて頂いて、HTMLでonsubmit="return false;"の記述とonclick="submit();"を組み合わせてinput type="button"にすればうまくいく事を知り、実際に作成してみたのですが、例えばPerlでHTMLを生成する際、ヒアドキュメントを利用せずに print "<form action='aaa.pl' method='POST' onsubmit='return false;'>\n"; や print "<input type='button' name='submit' value='保存' onclick='submit();'>\n";                                              ↑ と記述すると、エラーが生じうまくページが表示されません。セミコロンが途中で出てくるのでそれが原因かなと思ったりしているのですが、解決出来ません。原因とこの記述の方法でも出来る手段がありましたら、教えてください。お願い致します。

    • ベストアンサー
    • Perl
  • onClick="this.form.submit

    ・下記のようなformがあるのですが、 onClick="this.form.submit();" disabledの意味を教えてください ・クリックしたら、このフォーム内容を送信? ・アクション先も指定していないのに、処理はどこへいくのでしょうか? ・また、disabledは? ずっと押せない? <form name="hoge" method="POST"> <input name="hoge" type="button" class="button" value="piyo" onClick="this.form.submit();" disabled> </form>

  • 2重submit防止手法

    以前、画面内容を登録するためにFormのsubmitをした後、結果の画面が表示される前に、別のボタンを押すと、内容がnullのFormが送られる現象が発生することを教えていただきました。 このための防止策として、JSPの中で、フラグを定義し、falseであればsubmit処理し、trueであればsubmit処理しないようにコントロールするようにしました。 var flug = false; function update() { if (flug) { return; } flug = true; aaForm.type = "update"; document.aaForm.submit(); } function check() { if (flug) { return; } flug = true; aaForm.type = "icheck"; document.aaForm.submit(); } function idou() { aaForm.type = "idou"; document.aaForm.submit(); } ・ ・ <input type="button" name="add" value="登録" onClick="update();"/> <input type="button" name="chk" value="検索" onClick="check();"/> <input type="button" name="ido" value="移動" onClick="idou();"/> ・ ・ JSPを見ますと、同じ画面の時はflugをによる2重submit防止の手法が使われていますが、画面遷移するときは使われていません。画面遷移するときは、この手法でいいのでしょうか、それとも、画面遷移の時も2重submit防止手法を組み込んだほうがいいのでしょうか。 また、2重submitを防止するための他の手法がありましたら教えてください。 どうぞよろしくお願いします。

  • 結果がfalseでもsubmitしている?

    チェックボックスにチェックが入ったら テキストエリアに入力ができて、その入力チェックをする というスクリプトを書いていたのですが、 一番目のチェックボックスにチェックが入ったら 入力可能というところは出来るのですが 入力チェックで結果がfalseになっているのに submitされてしまいます。 どこか間違っているのでしょうか。 <html> <SCRIPT language="javascript"> <!-- function Yuukou(){ if(document.DOWN.A_CK.checked == true) { document.DOWN.A_SEL.disabled = false; } else{ document.DOWN.A_SEL.disabled = true; } } function check(){ if(document.DOWN.A_CK.checked == true) { if(document.DOWN.A_SEL.value =="") { alert("シリアル番号を入力してください") return false; } (略) } } //--> </SCRIPT> <FORM name="DOWN" action="A.cgi" onSubmit="check()" method="POST"> <INPUT type="checkbox" name="A_CK" id="A_CK" onClick="Yuukou()"> <INPUT size="20" type="text" disabled="disabled" name="A_SEL"> <input type="submit"> </form> </html>

  • Javascriptで二重送信を防止したいが、画像ボタンだとうまくいかない。

    Javascriptでフォームの二重送信防止を行いたいのですが、 送信ボタンが画像だとうまく動作しないようです。 下記のサイトを参考に作ってみたのですが、アラートすらもでないようです。 http://www.futomi.com/lecture/javacss/double_block.html 何かよい策がありましたら教えてください。お願いします。 <<ソース>> <script language="javascript"> <!-- // function submitForm() { document.formname.button.disabled = true; submitForm = disableButton; document.formname.submit(); return false; } function disableButton() { alert('処理中です。しばらくお待ち下さい。'); return false; } // --> </script> ~以下省略~ <form method="POST" form name="formname" action="test.cgi"> ----送信ボタンのコード----- <input type="image" src="images/acc_send.gif" name="send" onclick="submitForm()"> </form>

  • input type="image"の時、enterでsubmitされない方法

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=115527 で、「enterでsubmitされない方法」が記載されているのですが、 input type="image"の時、うまく反映されません。 formタグには以下のように、 <form name="form1" method="post" action="" onSubmit="return false"> 送信ボタンは以下のように設定しています。 <input type="image" src="***.gif" onClick="submit();"> ちなみにinput typeを"button""submit"にすると反映してくれますが "image"ではうまくいきません。 ご回答よろしくお願いします。

  • formの送信ボタンクリック後、別ウインドウ表示

    お世話になります。 現在下記の指定でPDFを表示しています。 <INPUT type="submit" name="submit" value="送信" onClick="form.action='tcpdf/pdf.php';return true" class="button_order"> これをクリック後、別ウインドウでPDFを表示したいのですが、 onClick="form.action='tcpdf/pdf.php';return true"の部分を onClick="form.action='tcpdf/pdf_sample.php';target='_blank'"とかにしても うまくいきせん。 ボタンはもう一つあるので、 <INPUT type="submit" name="submit" value="戻る" onClick="form.action='201504_1_2.php';return true" class="button_re-selection"> 出来れば、送信ボタンのみの設定を別ウインドウ表示にしたいです。 よろしくお願いいたします。

    • ベストアンサー
    • HTML
  • javascriptのonclickに関数を追加?

    現在、javascriptでinput要素に新しくonclick='hoge()'などの関数を追加したいのですができません。 色々調べたのですが、結局わからなかったので質問させていただきます。 何卒、ご教授宜しくお願いします。 ■やろうとしていること 下記ソースのボタンをどれかクリックしたら、 新しく、<input type="button" value="次へ" onclick="next()" />というのを<span>に 生成したいのですが、onclickが追加されずに困っております。 どのようにしたらよいのでしょうか?ちなみにtypeとvalueは生成されています。 <form name="test"> <input type="button" value="" id="answer_0" onclick="test(0)" /> <input type="button" value="" id="answer_1" onclick="test(1)" /> <input type="button" value="" id="answer_2" onclick="test(2)" /> </form> <span id="test2"></span> <script> function test(n) { ・・・ 中略 var nq = document.createElement('input'); nq.type = "button"; nq.value = '次へ'; nq.onclick = "next()"; document.getElementById('test2').appendChild(nq); } </script> 以上、宜しくお願い申し上げます。

  • INPUT上でリターンを押してもsubmitされない方法

    フォームにてキーワードを入力し、検索ボタン押したときに javascriptにて以下の動作をさせたいと思っています。  ・hidden項目に特定値をセットしてsubmitをかける 以下のコードを書いたのですが、INPUT上でリターンを押すと submitされてしまいます。 ボタン以外でリターンを押した場合に何も動作させないようにするにはどのようにすればよいのでしょうか? -------------------------------------------------------------- <SCRIPT language="JavaScript"> <!-- function javasc_name(param){ document.form.PARAM.value = param document.form.submit() } //--> </SCRIPT> <form method="POST" action="cgi-bin/xxx.exe"> <input type="text" name="KEYWORD"> <input type="hidden" name="PARAM"> <input type="button" value="検索" OnClick="javasc_name(10)"> </form> --------------------------------------------------------------

    • ベストアンサー
    • HTML