###実現したいこと
ユーザー名とメールアドレスの入力フォームがあり、「既存かどうか」と「入力値が正しいかどうか」を検証したいです。
###該当のソースコード
HTML
1<form class="form"> 2 name:<input type="text" class="name" name="name"><br> 3 mail:<input type="text" class="mail" name="mail"> 4</form> 5 6
###試したこと
入力値について、既存かどうかを検証するexistValidate()
と、文字数などテキストを検証すするdefectValidate
とを作りました。
Ajaxを使って既存を検証し、それがOKならばテキストの検証にいく。という流れを考えているものの、Ajaxの判定には時間がかかるために常にexist==undefined
になってしまい、条件分岐が思うように機能してくれません。
なので、exist
に値(true
かfalse
)が入るまで、条件分岐に行かないようにしたいです。
(条件分岐は下記10行目の部分です。)
/* 入力時に実行 */ $(document).on('input','.form input', function(){ const val = $(this).val(); const name = $(this).attr('name'); const exist = existValidate( name, val ); // ここでAjaxの返り値を格納したい const defect = defectValidate( name, val ); // 以下の処理を、exist に値が格納されるまで保留したい if( exist || defect ){ $(this).addClass('dame'); } else if( !exist && !defect ){ $(this).removeClass('ok'); } }); /* 既存を検証(setTimeoutにしていますが、実際はAjaxで既存を検証します) */ function existValidate( name, val ){ let exist; // 名前検証 if( name=='name' ){ setTimeout(function(){ exist = false; },2000); } // メールアドレス検証 else if( name=='mail' ){ setTimeout(function(){ exist = false; },2000); } return exist; // このreturnを待たずにinputイベントの条件分岐が発動してしまうのが問題 } /* テキストを検証 */ function defectValidate( name, val ){ let defect; // 名前検証 if( name=='name' ){ if( val.length > 4 && val.length < 21 ){ if( val.match(/^[0-9a-zA-Z\_]+$/) ){ defect = false; } else{ defect = true; } } else{ defect = true; } } // メールアドレス検証 else if( name=='mail' ){ if( val.match(/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*$/) ){ defect = false; } else{ defect = true; } } return defect; }
どうすれば既存の検証とテキストの検証がいずれも機能するようにできるでしょうか?
また、正規表現の部分や処理の流れなどググって見つけたものを自分でアレンジしましたので、おかしなところがございましたらあわせてご指南頂けましたら幸いです。
宜しくお願い申し上げます。
回答3件
あなたの回答
tips
プレビュー