質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

2362閲覧

【jQuery】2回クリックしないとformが送信されない

tsuyu

総合スコア5

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

3クリップ

投稿2020/01/22 06:44

編集2020/01/22 08:29

前提・実現したいこと

form送信前にAJAXで入力内容をチェックし問題がなければそのまま送信したい。
内容変更と新規登録をボタンで切り分けしているため.submit()ではなくclickイベントを使用しています。

発生している問題・エラーメッセージ

1回目のclickでformが送信されない。
2回目以降は普通に送信されます。

該当のソースコード

HTML

1<form action="edit2.php" method="post" id="myForm"> 2いろいろフォームの内容 3 4<input type="submit" name="update" value="内容変更" class="check" /><br> 5<input type="submit" name="insert" value="新規登録" class="check" /> 6</form>

jQuery

1$('.check').off('click'); 2$('.check').on('click',function(){ 3 var form = $("#myForm"); 4 form.submit(function(e) { 5 e.preventDefault(); //送信STOP 6 }); 7 8 $('.err').remove(); 9 var _this = $(this), 10 mode = _this.attr('name'), 11 datas = form.serialize(); 12 _this.val('チェック中'); 13 $.ajax({ 14 type: "POST", 15 cache: false, 16 url: "check.php", 17 data: { mode : mode, datas : datas }, 18 dataType:"json" 19 }).done(function(datas) { 20 if(datas['err']){ 21 $.each(datas.err,function(key, item){ 22 $('*[name="'+key+'"]').after('<span class="err"> '+item+'</span>'); 23 }); 24 _this.val('エラーあり'); 25 } else { 26 _this.val('OK'); 27 form.off('submit'); 28 form.submit(mode); 29 } 30 }); 31});

試したこと

どこまで進んでいるのかわからなかったのでボタンのvalueを書き換えてみたところ
きちんと「OK」になるのですが1回目のクリックではform.submit(mode);が動きません。
form.off('submit');の動きなどはあまりきちんとわかっていないためなぜ送られないのかがよくわかりません。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/01/22 06:52

>どこまで進んでいるのかわからなかったので console.log()で各所でなにかしら出力書いてコンソール確認された方が良いかと思います
tsuyu

2020/01/22 07:02

すみません、console.log()は今回投稿で消してました。 最終まで進んでいてformだけ送られない状態です。 もう一度クリックすると送られるのでoffの位置なのかと思ったのですが別の場所に書くとチェックの前に送られてしまって今の位置に戻しました。
mari.rinn

2020/01/22 07:49

これのhtmlの方も書いていただけますか?
guest

回答2

0

ベストアンサー

一旦イベントをpreventDefault()で止めて、ajaxのdoneの中で
条件を確認しつつ、特定条件でformをsubmitすればよいのでは?
まぁ一旦サブミットしてからサブミットするは効率いいかといわれると
微妙ですが

投稿2020/01/22 08:53

yambejp

総合スコア114747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsuyu

2020/01/23 01:36

clickではなくsubmitで判断するということでしょうか。 その場合どのボタンをクリックされたか取得の仕方がわからず今の状態になりました。
yambejp

2020/01/23 06:56

> clickではなくsubmitで判断するということでしょうか ちょっと認識がずれてます →イベントをpreventDefault()で止めて $('.check').on('click',function(e){ e.preventDefault(); →ajaxのdoneの中で条件を確認しつつ →formをsubmit var form=$(this).closest("form"); $.ajax({・・・}).done(function(data){ if(data=="なんちゃら"){ form.trigger('submit'); } });
tsuyu

2020/01/24 01:30

フォームの送信の止め方がわからず無駄な書き方をしていました。 すっきり書けました。ありがとうございました。
guest

0

最後のsubmit(mode)はsubmitイベントにバインドするだけの処理になっています。
第二引数にtrueを返すように指定することでsubmitできると思います。
追記~~
すみません。第二引数は関数の指定でした。submit(mode)と同じで第二引数を指定するのもバインドとするだけの処理です。

submit(mode); submit();

としてください。
.submit() リファレンス
リファレンスを見ると、
.submit(hoge),.submit(hoge,function(){}).bind('submit', handler)への、.submit().trigger('submit')へのショートカットですと書かれています。

~~追記終わり

動作検証していませんが、正しくはajaxの処理を下記のsubmitの処理で囲むのが正だと思います。

jquery

1 form.submit(function(e) { 2 e.preventDefault(); //送信STOP 3 });

参考URL

投稿2020/01/22 09:03

編集2020/01/23 01:51
makosankibu

総合スコア289

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsuyu

2020/01/23 01:34

submitの処理で囲んでも囲まなくてもこちらも処理が変わらず一旦外に出したものを書いてしまいました。 form.submit(mode, true);ということでしょうか。やはり2回めにformが送られました。
makosankibu

2020/01/23 01:51

追記をご覧ください。
tsuyu

2020/01/24 01:28

.trigger('submit') で送ることができました! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問