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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

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

Q&A

解決済

3回答

2819閲覧

JSのPromise処理でのsubmit送信を中断

sika

総合スコア52

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

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

0グッド

0クリップ

投稿2020/09/09 21:09

編集2020/09/09 21:12

jQueryのajaxでフォーム送信時にPOST前にDBの重複チェックを行い、チェックに引っかからなければそのままPOST送信、
チェックに引っかかった場合は送信処理を中断してアラート出力のスクリプトを作成中です。

問題は判定エラー時にアラート表示されても確認後にPOST送信が行われてしまいます。
非同期通信用の ajaxJsonResult は共通で使用しているためなるべくコードを流用したいのですが、
現状の構成でsubmitのイベントキャンセル伝達はできなでしょうか?

javascript

1// jsonデータをajax送信 2function ajaxJsonResult(url, datas, timeout, caches){ 3 return new Promise(function(resolve){ 4 $.ajax({ 5 url: url, type: 'POST', data: datas, timeout: timeout, contentType: "application/json", dataType: "json", caches: caches, 6 }).done(function(results){ 7 resolve(results); 8 }).fail(function(jqXHR, textStatus, errorThrown){ 9 console.log("データ取得失敗") 10 }); 11 }) 12} 13 14// 送信前にバックエンドでデータの重複チェック 15$('form').submit(function(e) { 16 ajaxJsonResult('/post_url/', {"id":"1"}, 5000, true).then((results) => { 17 if(results.status == "success"){ 18 // 判定クリア時は追加処理後に送信 19 }else{ 20 // 判定エラー時はフォーム送信中断 21 alert("重複エラー"); 22 e.stopPropagation(); // submit処理中止 23 } 24 }).catch((err) =>{ console.error(err);}); 25}); 26

※バックエンドはDjangoで送受信処理は問題なく実装できております。
どうぞ宜しくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

そもそも、フォームsubmitではなくボタンclickで処理すれば良いのでは?
ボタンもsubmitではなくbuttonにしておけばキャンセルを考える必要もないかと思います。
OKのときだけJavaScriptでsubmitをします。

投稿2020/09/09 21:56

m.ts10806

総合スコア80875

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

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

sika

2020/09/09 22:49

ご回答ありがとうございます。 煮詰まり過ぎて根本的な事に気付きませんでした・・・お恥ずかしい限りです ご指摘通りボタンclickに変更し、判定クリア時に `$('form').submit()` に修正致しました。
guest

0

POSTをして登録・更新をかけて、失敗したときにエラーをだしてください。
チェックして再送信だとチェックと再送信の間にエラーになる
作業がはいる可能性があります

投稿2020/09/10 00:34

yambejp

総合スコア116724

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

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

sika

2020/09/10 05:02

ご回答ありがとうございます。 仕様上、フォーム内にユーザー側で動的にフォームタグを追加する項目が多く、 通常のサーバー側での送信後のエラーリダイレクトが起こった際に入力画面に戻るとユーザー側で動的追加した項目がリセットされてしまうためどうしても送信前にすべての入力値に対してバリデーション処理を行いたかった次第です・・
yambejp

2020/09/10 05:09

そういうことであれば事前チェクは行うとして、本ちゃんのサブミット時にも 確実の事前と同等のチェックはいれてください
sika

2020/09/10 05:20

ご返信ありがとうございます。 色々と言葉足らずで申し訳ございません。 フロント側でのチェックはあくまで入力値のDB重複チェック(過去に同じ組み合わせの設定がされているか)までの範囲を想定しております。 サーバー送信時は同等のチェックを踏まえてきちんとバリデーションを実装させていただきます。 ご親身にアドバイスいただきありがとうございました。
guest

0

同期処理

JavaScriptから同期Submit送信をabortする方法は私の知る限りでは有りません。
同期処理はJavaScriptを介さずに行われる処理であり、それをJavaScriptから制御する機能が実装されている可能性は低いと考えます。

サーバサイドスクリプト側でajax処理を捕まえて、submit処理側と同期を取って処理を停止する必要がありますが、そうするぐらいなら、sumit送信を受けるサーバサイドスクリプト側にajax処理を含める方が遥かにスマートでしょう。

妥協案

どうしても、ajaxで追加処理をさせたいのなら、下記実装が考えられます。

  1. event.preventDefault()
  2. ajax処理
  3. ajax処理成功時に event.target.submit()

ただし、ajax処理が完了するまで同期submitを待機させる事となり、非同期処理の利点は失われます。
また、ユーザは「submitボタン押下後に通信が何も発生せず、しばらく待った後に突然submit送信が始まる」という現象になる為、決して分かりやすいUIとはいえず、ユーザビリティが低い実装となります。

submit受け側のサーバサイドスクリプトに追加処理を加えるのが最適解なのは間違いないと思います。

Re: sika さん

投稿2020/09/09 22:31

編集2020/09/09 22:36
think49

総合スコア18189

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

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

sika

2020/09/09 22:49

ご回答ありがとうございます。 > sumit送信を受けるサーバサイドスクリプト側にajax処理を含める方が遥かにスマートでしょう。 おっしゃる通りです。 仕様上、フォーム内にユーザー側で動的にフォームタグを追加する項目も多く、送信後の入力値エラーの場合にリダイレクトで入力画面に戻るとユーザー側で動的追加した項目がリセットされてしまうためどうしても送信前にすべてのバリデーション処理を行いたかった次第です・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問