🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

jQuery

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

Ajax

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

Q&A

解決済

2回答

1682閲覧

ajaxで入力チェックを併用する場合の実務

SugiuraY

総合スコア318

JavaScript

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

jQuery

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

Ajax

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

0グッド

0クリップ

投稿2018/10/30 12:54

夜分失礼いたします。

下記のように、クライアントサイドで入力チェックを作成しているのですが、#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>&nbspすでに使用されているユーザ名です</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>&nbspユーザ名を入力してください</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>&nbsp性別を選択してください</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>&nbspすでに使用されているユーザ名です</p>').appendTo('.errmessagebox').hide().fadeIn(1000); 3 }

上記のような処理にした結果、errormessgeのappendToのタイミングも微妙にずれてくるので気持ちが悪いのですが、一般的にこのようにクライアントサイドとajaxを使ったサーバーサイドのチェックを併用する場合

  1. 他のエラー(#er1や#er2)も、下記のようにajax内の処理に含めて実行するのでしょうか?
  2. それとも他の解決方法があり一般的なものがあればご教示頂けますでしょうか?

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>&nbspユーザ名を入力してください</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>&nbsp性別を選択してください</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>&nbspすでに使用されているユーザ名です</p>').appendTo('.errmessagebox').hide().fadeIn(1000); 28 } 29 if (errCode.length<1){ 30 /*エラーがない場合の処理を実行*/ 31 } 32 }, 33 function(){//fail 34 console.log('failed'); 35 } 36)

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問文中にある方法(サーバー検証の結果が返ってきたときに、クライアント検証を行う)で、問題ないと思います。

ただ、もしクライアント検証とサーバー検証が同等の処理でない(サーバー検証→クライアント検証の順で行う必要がある)ことを気にするなら、クライアント検証を一瞬で終わる非同期処理とみなして、検証処理すれば良いかと思います。

//クライアント検証 var clientValidate = function(){ var def = $.Deferred(); const errCode = []; if (username=="") { errCode.push("username") }else{ errCode.splice(errCode.indexOf("username"),1); } if (gender=="") { errCode.push("gender") }else{ errCode.splice(errCode.indexOf("gender"),1); } return def.resolve(errCode).promise(); }; //サーバー検証 var serverValidate = function(){ return $.ajax({ type:'POST', url:'duplicatename.php', datatype:'json', data:{ transfer_name:username } }); }; //各検証の実行 const p1 = clientValidate(); const p2 = serverValidate(); //クライアント検証・サーバー検証の両方の処理が終わったあとに //検証後の処理を実行する $.when(p1, p2).done(function(result1, result2){ //処理続行 or エラー表示 });

投稿2018/10/30 13:52

編集2018/10/30 14:25
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SugiuraY

2018/10/30 14:07

コメントありがとうございます、 自分自身で長文を書いたので、申し訳ないのですが、文中にある方法とは、thenでsuccess時にすべての処理を記載する方法を指していると理解いたしました。 deferred when promiseの存在は知っていたのですが、このような使い方なんですね!! "クライアント検証を一瞬で終わる非同期処理とみなして"という点がまだ理解ができないのですが、この機会にこれらの使い方を勉強してみようと思います!
退会済みユーザー

退会済みユーザー

2018/10/30 14:21

>文中にある方法とは、thenでsuccess時にすべての処理を記載する方法を指していると理解いたしました。 言葉足らずで申し訳ありません。「文中にある方法」は、仰るとおりです。 >"クライアント検証を一瞬で終わる非同期処理とみなして"という点がまだ理解ができないのですが こちらも言葉足らずですみません。$.ajax()の戻り値はPromiseなので、clientValidateのように、同期検証の戻り値もPromiseにすると、同期検証の結果を非同期検証の結果と同じように扱うことができるようになるという意味で書きました。
SugiuraY

2018/10/30 15:13

コメントいただきありがとうございます。 とんでもございません、こちらこそ理解不足で申し訳ございません。 概ね理解することができました!細かい仕様は自分自身でも勉強して早速実装してみようと思います。 質問して本当に良かったです。 改めて深謝を申しあげます。 よろしくお願い申し上げます。
guest

0

単にその非同期処理が終わるのを待って、エラー有無判定をすればいいだけですね。

投稿2018/10/30 13:37

y_waiwai

総合スコア88038

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

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

SugiuraY

2018/10/30 14:00

コメントありがとうございます。 初心者のため、思い切ってお尋ねさせてください。 ajaxでは非同期処理が終わってから処理するのは、successの中に(上記ではthen)のなかに処理を記述するほかないと理解しているのですが、ほかに方法があるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問