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

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

新規登録して質問してみよう
ただいま回答率
85.48%
jQuery Validation Plugin

jQuery Validation PluginはjQueryのプラグインであり、クライアント側のデータ検証を行う役割があります。

jQuery

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

Q&A

解決済

1回答

1701閲覧

juqery Valiation.jsのボタン活性化の切り替え

yunnyunnku

総合スコア9

jQuery Validation Plugin

jQuery Validation PluginはjQueryのプラグインであり、クライアント側のデータ検証を行う役割があります。

jQuery

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

0グッド

0クリップ

投稿2020/08/11 15:51

編集2020/08/12 08:11

前提・実現したいこと

Valiation.jsライブラリを使用してフォームのバリデーションを設定しています
エラーメッセージ等は表示されるのですが、submitの非活性化の切り替えが上手く動作しません。
初歩的な事で間違っているかもしれないのですが、私の知識不足で1人で解決できませんでした。
わかる方どうかご教授いただきたいです。

該当のソースコード

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <form id="form" class="Form" action="/*グーグルフォームに飛ぶ予定です*/" method="post"> <ul> <li> <label for="name">名前</label> <input type="text" name="entry.1081701488" placeholder="お名前" value=""> <span class="error"></span> </li> <li> <label for="mail">メールアドレス</label> <input type="email" name="entry.1249159500" placeholder="メールアドレス" value=""> <span class="error"></span> </li> <li> <label for="msg">内容</label> <textarea name="entry.1006037710" placeholder="内容をご記入ください" ></textarea> <span class="error"></span> </li> <li class="btn"> <button type="submit" name="send" disabled>送 信</button> </li> </ul> </form> <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js'></script> <script src='https://cdnjs.cloudflare.com/ajax/libs/paginationjs/2.1.5/pagination.min.js'></script> <script src="./node_modules/modaal/dist/js/modaal.min.js"></script> <script src="./node_modules/jquery-validation/dist/jquery.validate.js"></script> <script src="./dist/script.js"></script> </body> </html>
//valiation設定 const rule = { 'entry.1081701488':{required:true,minlength:2,maxlength:10}, 'entry.1249159500':{required:true,email:true,}, 'entry.1006037710':{required:true} }; const msg = { 'entry.1081701488':{ required:"* 必須項目です", minlength:"* 2文字以上ご入力ください", maxlength:"* 10文字以内でご入力ください" }, 'entry.1249159500':{ required:"* 必須項目です", email:"* メールアドレスをご入力ください" }, 'entry.1006037710':{ required:"* 用件をご記入ください", } }; $(function(){ $('#form').validate({ rules:rule, messages:msg, }); if($('#form').valid()){ $('button').attr('disabled',false); }else{ $('button').attr('disabled',true); } });

試したこと

過去に同じ様な質問をされていた方がいたので、
そちらの回答を参考に行ってみましたが私のやり方が違うのか上手くできませんでした。
https://teratail.com/questions/67526

追記

$(function(){ $('#form').validate({ rules:rule, messages:msg, submitHandler:function(){ let submit = $('button').data("submit"); if(!submit){$('form ul').append("<li>送信完了しました</li>"); $('button').data("submit",true);} else{$('form ul li:last-of-type').text('送信完了しました'); $('button').data("submit",true);} $('button').attr('disabled',true); return false}, invalidHandler:function(){ let submit = $('button').data("submit"); if(!submit){$('form ul').append("<li>送信ができませんでした</li>"); $('button').data("submit",true);} return false} }); });

https://teratail.com/questions/67526
参考にしたこちらのやり方は実装できたのですが、私がやりたい動作とは少し違っていました。

希望の操作
①入力項目が全て埋まっている時は<button>の「disabled」を削除、埋まっていない時は追加を行う。

HTMLInputElement.checkValidity()
こちらを使ったやり方だと私のやりたい様なことが実装できそうだったのですが、併用して使うとValiation.js
の方が今度は上手く反応せず、手詰まりでした。

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

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

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

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

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

dameo

2020/08/12 08:17

submitの非活性化の説明をしていないので、本来やりたいことと、実現可能なことが入り混じってるだけだと思います。 jquery.validate.jsはsubmitをする前にメッセージを表示したり、活性/非活性の制御はしません。 submitをした後に初めてエラーメッセージを出してくれ、条件が整ったときにリアルタイムにエラーメッセージがついたり消えたりします。 その間もボタンの活性非活性はそのままです。 公式のデモでも確認できますので、自分できちんと使い方を調べてから使いましょう。 https://jqueryvalidation.org/ ボタンのdisableを取り、jsからもボタンを操作しなければ公式の使い方になります。 過去の質問者はそこまで出来た上で、submit時の二重送信防止を実装しただけです。 二重送信防止とはダブルクリックのように連続して何度もボタンを押した場合に、2回サブミットされてしまう現象のことです。その実装が上手く行かず困っていたので、 https://jqueryvalidation.org/validate/#submithandler を使う方法を回答者が答えたという流れです。 つまり、 $(function(){   $('#form').validate({     rules:rule,     messages:msg,     submitHandler: function(form) {       $('button').attr('disabled', true);       // すぐ飛ぶと見えないので10秒wait       setTimeout(function(){         window.location.href = "/*グーグルフォームに飛ぶ予定です*/"; // これだと送信されませんが       },10000)     }   }); }); ※空白が全角空白です
yunnyunnku

2020/08/12 09:05

>jquery.validate.jsはsubmitをする前にメッセージを表示したり、活性/非活性の制御はしません。 submitをした後に初めてエラーメッセージを出してくれ、条件が整ったときにリアルタイムにエラーメッセージがついたり消えたりします。 公式をちゃんと理解していませんでした。エラー判定はボタンを押してからされるんですね。 ご回答ありがとうございました。m(_ _)m
guest

回答1

0

自己解決

$(function(){ $('button').attr('disabled',true); $('#form').validate({ rules:rule, messages:msg, submitHandler:function(){ let submit = $('button').data("submit"); if(!submit){$('form ul').append("<li><p>送信完了しました</p></li>"); $('button').data("submit",true);} else{$('form ul li:last-of-type').text('送信完了しました'); $('button').data("submit",true); } $('button').attr('disabled',true); return false}, }); $('form').on('input',function(){ $('#form').valid(); if($('#form').valid()){ $('button').attr('disabled',false); }else{ $('button').attr('disabled',true); } }); });

エラー判定がsubmit時に判定されるということをちゃんと理解していませんでした。
それを知った上で、inputイベントを行った後に.valid()で呼び出す設定にしたら行いたいことが実装できました。
ありがとうございました。

投稿2020/08/12 10:05

yunnyunnku

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問