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

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

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

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

jQuery

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

Q&A

解決済

3回答

1430閲覧

Ajaxで取得したデータを自作関数に渡す方法

huyumin

総合スコア16

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2019/08/15 19:10

編集2019/08/18 13:20

###実現したいこと
ユーザー名とメールアドレスの入力フォームがあり、「既存かどうか」と「入力値が正しいかどうか」を検証したいです。

###該当のソースコード

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に値(truefalse)が入るまで、条件分岐に行かないようにしたいです。
(条件分岐は下記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; }

どうすれば既存の検証とテキストの検証がいずれも機能するようにできるでしょうか?

また、正規表現の部分や処理の流れなどググって見つけたものを自分でアレンジしましたので、おかしなところがございましたらあわせてご指南頂けましたら幸いです。

宜しくお願い申し上げます。

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

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

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

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

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

m.ts10806

2019/08/15 22:44

「Ajax 終わるのを待ってから」などでもヒントとなる情報はでそうですがそれではなにか足りませんか? 実際に調べたことそれをもって試したことを質問に追記してください
think49

2019/08/17 03:09

タイトルが抽象的なので、「Ajaxで取得したデータを自作関数に渡す方法」のように質問内容を要約したタイトルに変更して頂けませんか
x_x

2019/08/19 01:39

サーバーに問い合わせなくてもよい「テキストの検証」を先にしたほうがいいかと思いますが、逆にしているのはなぜでしょうか?
Lhankor_Mhy

2019/08/19 10:12

「まだ回答を求めています」とのことですが、3件の回答を得てなおご不明の部分があるということかと思いますが、その部分を具体的にご提示ください。
guest

回答3

0

投稿2019/08/16 00:08

azuapricot

総合スコア2341

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

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

huyumin

2019/08/19 00:48 編集

どうもどうも
guest

0

ベストアンサー

本題は既に回答ついているので置いておいて・・・

おかしなところがございましたらあわせてご指南頂けましたら幸いです。

おかしいわけではないですが、判定処理が間延びしているのが個人的には好きじゃないです。
例えば、初期値を与えるだけでも大分削る事ができます。

let defect = true; // 名前検証 if( name=='name' ){ if( val.length > 4 && val.length < 21 ){ if( val.match(/^[0-9a-zA-Z\_]+$/) ){ defect = false; } } } // メールアドレス検証 else if( name=='mail' ){ if( val.match(/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*$/) ){ defect = false; } } return defect;

さらに言うと、折角nameとmailで同じ処理を通ってきているのに、わざわざifで2分割にしているのはちょっと気持ち悪いので、

var exps = { 'name': /^[0-9a-zA-Z\_]+$/, 'mail': /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*$/ }; if(name=='name' && val.length <= 4 || val.length > 20) { return true; } return !(val.match(exps[name]));

等とすると気持ちいいです。(個人的な感想です。)

あと、2重否定(defectがfalse 欠陥がない)は分かりにくくなるので、validがtrueとかの方が後で見た時分かり易いと思いますよ。

投稿2019/08/16 00:28

moredeep

総合スコア1507

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

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

huyumin

2019/08/18 13:22

初期値いいですね。さっそくそうさせて頂きます。ありがとうございます。 後半の気持ちよさですが、 return !(val.match(exps[name])); で何を返しているのかわからないことと、あとmailの方をどうするのかがわかりませんでした。
moredeep

2019/08/19 06:25 編集

exps["name"]がname用の正規表現、exps["mail"]がmail用の正規表現なので、引数nameが"name"か"mail"かになることで、 return !(val.match(exps[name])); だけで"name"、"mail"ともに正規表現を掛けることができます。 val.matchがtrueの場合にdefectがfalseになるため、val.matchを否定(!)することで直でリターンすることができます。 ところで、まだ回答を求めていますとなっていますが、何がわかっていないのか明示しないと、回答つきにくいと思いますよ。
huyumin

2019/08/21 14:25

遅くなりました。そういう仕組みでしたか。追加でご回答ありがとうございます。
guest

0

根本的にもっと簡単な方法を使えば とも思います。
文字数制限に関してはjquery使わなくても、html5でinputの入力文字数を制限するminlengthは指定数以内で、maxlengthは指定数以上は入力出来ないので、チェックする必要がなく、
4文字から20文字までなら

html

1<input type="text" class="name" name="name" minlength="4" maxlength="20" placeholder="name 4〜20文字内で">

みたいにすれはばチェック不要になります。

すべてのチェックを一気に行なおうとせずに、個々のinputの下にその内容のメッセ表示する場所を用意しといて、そのinputからfocusが外れたらチェックを行うようにすると処理が格段に早くなると思いますよ。例えばnameの場合

jQuery

1$(".name").blur(function(){チェック等処理});

投稿2019/08/16 03:11

編集2019/08/16 09:49
mari.rinn

総合スコア296

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

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

kei344

2019/08/16 06:46

引用符が全角になっていますよ。
mari.rinn

2019/08/16 06:57 編集

ごめんなさい!スマホから書いてて、今気づいて直したところです。失礼しました。ついでにminlen gthも付け足しました。
kei344

2019/08/16 06:59

(‘.name’も引用符が全角)修正ありがとうございます。
mari.rinn

2019/08/16 09:54

kei344様 度々ほんとにすみません!ご指摘ありがとうございます。 そっか!正しいのを入力してたら色が変わるんですね!今頃わかりました!(使い方が把握出来きれてなくてすみません)、教えてくださり感謝です!
huyumin

2019/08/18 13:21

ありがとうございます。maxlength指定などしておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問