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

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

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

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

1186閲覧

入力値が正しい時はボタンを有効にする処理

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2021/04/23 17:23

編集2021/04/23 17:25

前提・実現したいこと

フォームに情報を複数入力してもらい、その入力された情報が正規表現を通った時だけ「送信」ボタンを押せるようにしたいです。

学習を始めて1週間前後なので、コードの書き方等については無駄な点などがあってもご容赦いただきたいです。

発生している問題・エラーメッセージ

こういった場合、if文の条件式の欄にどのように書けば良いのでしょうか?

あまり良いやり方だとは思わなかったのですが、各else後に、コールバック関数のスコープ外であらかじめ宣言した変数に文字列などを代入。
それを3つ一致させればtrueになるかな、と思ったのですが、イベントを起こした後に変数に代入した文字列が関数の外ではなかったことになるのか、ボタンが押せるようになりませんでした。

上記のような方法(間違っていますが)くらいしか思いつかなかったので、ヒントをいただきたいです。

該当のソースコード

<form id="form"> ユーザー名(半角英数):<input type="text" id="name" value="" style="width:200px;"><br> <p id="error1"></p><br> パスワード(半角英数):<input type="password" id="password1" value="" style="width:150px;"><br> <p id="error2"></p><br> パスワード(確認):<input type="password" id="password2" value="" style="width:150px;"><br> <p id="error3"></p><br> <input type="button" id="btn" value="送信"> </form> // 結果 var answer = document.getElementById('answer'); // エラーメッセージ var error = document.getElementById('error'); // ボタン 通常時は押せない var btn = document.getElementById('btn'); btn.disabled = true; var name1 = document.getElementById('name'); var password1 = document.getElementById('password1'); var password2 = document.getElementById('password2'); name1.addEventListener('focusout',function(){ if(!name1.value.match(/^([a-zA-Z0-9]{6,16})$/)){ error1.innerHTML = '正しくありません'; }else{ error1.innerHTML = ' '; } }, false); password1.addEventListener('focusout',function(){ if(!password1.value.match(/^([a-zA-Z0-9]{8,})$/)){ console.log(password1.value); error2.innerHTML = '正しくありません'; }else{ error2.innerHTML = ' '; } }, false); password2.addEventListener('focusout',function(){ if(!password2.value.match(/^([a-zA-Z0-9]{8,})$/)){ error3.innerHTML = '正しくありません'; }else{ error3.innerHTML = ' '; } }, false); if(){ btn.disabled = false; btn.addEventListener('click',function(){ answer.innerHTML = 'OK'; }, false); }

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

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

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

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

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

guest

回答2

0

フォームに情報を複数入力してもらい、その入力された情報が正規表現を通った時だけ

これはJavaScriptを使わなくてもHTMLの機能だけで実現できます。
こんな感じで:

<input type="text" id="name" name="name" pattern="^([a-zA-Z0-9]{6,16})$">

これで対処しきれないレベルのバリデーションをしたい場合は、「制約検証API」というのを利用すると良いようです。その利用法と、何らかの理由でこれを使いたくない場合の「素の」JavaScriptでの実現方法は、この辺に解説されています。

クライアント側のフォームデータ検証 - ウェブ開発を学ぶ | MDN

投稿2021/04/23 19:01

KojiDoi

総合スコア13671

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

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

退会済みユーザー

退会済みユーザー

2021/04/24 05:25

ありがとうございます。 初めて知りました。 同じ質問になってしますのですが、こちらを利用してフォームの値が正規表現を通った時だけ「送信」ボタンを押せるようにしたい場合は、if文にどのような条件式を書けば良いのかのヒントをいただければと思います。
退会済みユーザー

退会済みユーザー

2021/04/24 08:17

はい。 教えていただいたやり方で実装する場合、if文の条件式にどのように書けばボタンが押せるようになるのかが思い付かないです。
KojiDoi

2021/04/24 08:24

そこに書いてあると思いますが、どこがどう思いつかないのでしょうか?
退会済みユーザー

退会済みユーザー

2021/04/24 08:36

教えていただいたやり方だと、html内で既に正規表現が実行されるということですが、上のurl先のサイトではJavaScriptで正規表現を行っているかと思います。 この場合、htmlで正規表現を通過してきたvalueを再度JavaScriptで正規表現し、その正規表現をifの条件式に入れれば良いのでしょうか?
KojiDoi

2021/04/24 08:43

いや、複数のやり方が紹介されているだけですよ。自分の目的にあった部分だけを取捨選択してください。
退会済みユーザー

退会済みユーザー

2021/04/24 11:06

ありがとうございます。
guest

0

ベストアンサー

雑ですが、こんな感じでしょうか。

js

1~略~ 2 3name1.addEventListener('focusout', function() { 4 if (!name1.value.match(/^([a-zA-Z0-9]{6,16})$/)) { 5 error1.innerHTML = '正しくありません'; 6 } else { 7 error1.innerHTML = ' '; 8 } 9 check(); 10}, false); 11 12password1.addEventListener('focusout', function() { 13 if (!password1.value.match(/^([a-zA-Z0-9]{8,})$/)) { 14 console.log(password1.value); 15 error2.innerHTML = '正しくありません'; 16 } else { 17 error2.innerHTML = ' '; 18 } 19 check(); 20}, false); 21 22password2.addEventListener('focusout', function() { 23 if (!password2.value.match(/^([a-zA-Z0-9]{8,})$/)) { 24 error3.innerHTML = '正しくありません'; 25 } else { 26 error3.innerHTML = ' '; 27 } 28 check(); 29}, false); 30 31function check() { 32 if (!(error1.innerHTML + error2.innerHTML + error3.innerHTML).trim()) { 33 btn.disabled = false; 34 btn.addEventListener('click', function() { 35 answer.innerHTML = 'OK'; 36 }, false); 37 } else { 38 btn.disabled = true; 39 } 40}

投稿2021/04/23 18:55

satokei

総合スコア1217

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

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

退会済みユーザー

退会済みユーザー

2021/04/24 05:30

ありがとうございます。 参考にさせていただき、動作確認してみます。
退会済みユーザー

退会済みユーザー

2021/04/24 05:40

連続で失礼いたします。 一度まったく同じコードで動作確認をしてみたのですが、この場合ユーザー名を正しく入力しただけで「送信」ボタンを押せるようになってしまいました。 残りの2つは, 未入力でもボタンが押せる 正しく入力すればボタンが押せる 正しくない入力をするとボタンが押せない という状況になります。 ユーザー名だけでボタンが押せるようになってしまう原因にはどういったことが考えられるのでしょうか?
satokei

2021/04/24 16:05

check() で、未入力かどうかを判定していないからですね。 頑張って動作を理解してみてください。
退会済みユーザー

退会済みユーザー

2021/04/24 16:14

ありがとうございます。 無事に完成しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問