夜分失礼いたします。
下記のように、クライアントサイドで入力チェックを作成しているのですが、#erのユーザ名がすでに使用されているかどうかというチェック項目のみ非同期通信で、サーバー処理をさせています。このような処理の構造自体はよくあると思います。
html
1<div class="register_wrapper"> 2 <div class="flex_inner flex_right"> 3 <input type="text" id="username" class="register_text" placeholder="ユーザ名"/> 4 5 <select name="select_1" id="" style="font-size:13px;" class="ui dropdown"> 6 <option class="gender" value="">性別</option> 7 <option class="gender" value="1">女性</option> 8 <option class="gender" value="2">男性</option> 9 </select> 10 </div> 11 12 </div> 13<button class="register_button" type="button">アカウントを作成する</button>
javascript
1$(document).on('click','.register_button',function(){ 2 $('#er1,#er2,#er3').remove(); 3 const username = $('#username').val(); 4 const gender = $('.gender:selected').val(); 5 6 7/*未入力チェック*/ 8 const errCode = []; 9 if (username=="") { 10 errCode.push("username") 11 }else{ 12 errCode.splice(errCode.indexOf("username"),1); 13 } 14 if (gender=="") { 15 errCode.push("gender") 16 }else{ 17 errCode.splice(errCode.indexOf("gender"),1); 18 } 19 20 $.ajax({ 21 type:'POST', 22 url:'duplicatename.php', 23 datatype:'json', 24 data:{ 25 transfer_name:username 26 } 27 }) 28 .then( 29 function(data){//success 30 if (data.status) { 31 errCode.push("usedname") 32 $('<p id="er3" class="errmessage"><i class="fa fa-exclamation-circle" aria-hidden="true"></i> すでに使用されているユーザ名です</p>').appendTo('.errmessagebox').hide().fadeIn(1000); 33 }else{ 34 errCode.splice(errCode.indexOf("usedname"),1); 35 } 36 }, 37 function(){//fail 38 console.log('failed'); 39 } 40 ) 41 42//error message 43 if (errCode.indexOf("username")>=0) { 44 $('<p id="er1" class="errmessage"><i class="fa fa-exclamation-circle" aria-hidden="true"></i> ユーザ名を入力してください</p>').appendTo('.errmessagebox').hide().fadeIn(1000); 45 } 46 if (errCode.indexOf("gender")>=0) { 47 $('<p id="er2" class="errmessage"><i class="fa fa-exclamation-circle" aria-hidden="true"></i> 性別を選択してください</p>').appendTo('.errmessagebox').hide().fadeIn(1000); 48 } 49 50 51 })
本来は名前の重複である#er3も含めて、errCodeに格納して、最終的に配列に何かのエラーがあれば、
それぞれに対応するエラーを吐き出すとしたいのですが、当然非同期でやっている#er3については、"usedname"が格納されることをまたずにifでエラーの有無判定が実行されているため、現在、上記のようにajax内で分けて処理させております。
javascript
1 if (errCode.indexOf("usedname")>=0) { 2 $('<p id="er3" class="errmessage"><i class="fa fa-exclamation-circle" aria-hidden="true"></i> すでに使用されているユーザ名です</p>').appendTo('.errmessagebox').hide().fadeIn(1000); 3 }
上記のような処理にした結果、errormessgeのappendToのタイミングも微妙にずれてくるので気持ちが悪いのですが、一般的にこのようにクライアントサイドとajaxを使ったサーバーサイドのチェックを併用する場合
- 他のエラー(#er1や#er2)も、下記のようにajax内の処理に含めて実行するのでしょうか?
- それとも他の解決方法があり一般的なものがあればご教示頂けますでしょうか?
javascript
1 .then( 2 function(data){//success 3 const errCode = []; 4 if (username=="") { 5 errCode.push("username") 6 }else{ 7 errCode.splice(errCode.indexOf("username"),1); 8 } 9 if (gender=="") { 10 errCode.push("gender") 11 }else{ 12 errCode.splice(errCode.indexOf("gender"),1); 13 } 14 if (data.status) { 15 errCode.push("usedname") 16 }else{ 17 errCode.splice(errCode.indexOf("usedname"),1); 18 } 19 20 if (errCode.indexOf("username")>=0) { 21 $('<p id="er1" class="errmessage"><i class="fa fa-exclamation-circle" aria-hidden="true"></i> ユーザ名を入力してください</p>').appendTo('.errmessagebox').hide().fadeIn(1000); 22 } 23 if (errCode.indexOf("gender")>=0) { 24 $('<p id="er2" class="errmessage"><i class="fa fa-exclamation-circle" aria-hidden="true"></i> 性別を選択してください</p>').appendTo('.errmessagebox').hide().fadeIn(1000); 25 } 26 if (errCode.indexOf("usedname")>=0) { 27 $('<p id="er3" class="errmessage"><i class="fa fa-exclamation-circle" aria-hidden="true"></i> すでに使用されているユーザ名です</p>').appendTo('.errmessagebox').hide().fadeIn(1000); 28 } 29 if (errCode.length<1){ 30 /*エラーがない場合の処理を実行*/ 31 } 32 }, 33 function(){//fail 34 console.log('failed'); 35 } 36)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/30 14:07
退会済みユーザー
2018/10/30 14:21
2018/10/30 15:13