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

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

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

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

Q&A

解決済

2回答

1705閲覧

javascriptのみでのフォームリアルタイムチェック

halhalYam

総合スコア8

JavaScript

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

0グッド

0クリップ

投稿2021/03/26 10:12

編集2021/03/26 10:16

前提条件

規定でjQueryのリアルタイムチェックは使用不可です。
こちらのサイトを参考にリアルタイムチェックのjsを設置しました。
https://liberty-dock.com/business_post/js%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/

やりたいこと、問題

最初からエラーメッセージを表示し、入力するとエラーが外れます。
コードは下記ですが、ラジオボタンはクリックすると反応しますが、
テキストボックスは文字を入力しても反応しません。
どこに問題があるのか教えていただければ助かります。

html

1<div class="err_01"> 2<p>お名前<span>必須</span></p> 3<p class="error on">お名前をご入力ください!</p> 4<input value="" type="text" name="textbox1"> 5</div> 6 7<div class="err_02"> 8<p>ふりがな<span>必須</span></p> 9<p class="error on">ふりがなをご入力ください!</p> 10<input value="" type="text" name="textbox2"> 11</div> 12 13<div class="err_03"> 14<p>プレゼントを選んでください<span>必須</span></p> 15<p class="error on">プレゼントをお選びください!</p> 16<label for="radio1_0"><input name="radio1" type="radio" id="radio1_0" value="0"></label> 17<label for="radio1_1"><input name="radio1" type="radio" id="radio1_1" value="1"></label> 18<label for="radio1_2"><input name="radio1" type="radio" id="radio1_2" value="2"></label> 19</div>

css

1.error{display:none;} 2.on{ 3display:inline-block; 4position:relative; 5background:red; 6padding:15px; 7text-align:center; 8color:white; 9-webkit-border-radius:3px; 10-moz-border-radius:3px; 11margin:3px; 12} 13.on:after{/*ふきだし*/ 14border: solid transparent; 15content:''; 16height:0; 17width:0; 18pointer-events:none; 19position:absolute; 20border-color:red; 21border-top-width:10px; 22border-bottom-width:10px; 23border-left-width:10px; 24border-right-width:10px; 25margin-left: -10px; 26border-top-color:#red; 27top:100%; 28left:12%; 29} 30

javascript

1//お名前 2function text_require01(_this) { 3 if(_this.val().length > 200 || _this.val() == ''){ 4 _this.next('.error').addClass('on'); 5 } else { 6 _this.next('.error').removeClass('on'); 7 } 8} 9 10//ふりがな(実際はふりがなではないため、カタカナのみなどの判定はいりません) 11function text_require02(_this) { 12 if(_this.val().length > 200 || _this.val() == ''){ 13 _this.next('.error').addClass('on'); 14 } else { 15 _this.next('.error').removeClass('on'); 16 } 17} 18//プレゼント 19function radio_require01(_this) { 20 var check_require = _this.parents('.err_03').find('input[type="radio"]:checked').length 21 if(check_require > 0){ 22 _this.parents('.err_03').children('.error').removeClass('on'); 23 } else { 24 _this.parents('.err_03').children('.error').addClass('on'); 25 } 26} 27//各種関数のまとめ 28function batch_execution() { 29 text_require01($(".err_01 input[type=text]")); 30 text_require02($(".err_02 input[type=text]")); 31 radio_require01($(".err_03 input[type=radio]")); 32} 33//バリデーションの実行タイミング 34$(function(){ 35$('.err_01 input[type="text"]').blur(function(){ 36text_require01($(this)); 37}); 38$('.err_02 input[type="text"]').blur(function(){ 39text_require02($(this)); 40}); 41$('.err_03 input[type="radio"]').on('change', function(){ 42radio_require01($(this)); 43}); 44});

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

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

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

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

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

guest

回答2

0

回答になるかどうかわかりませんが、参考までに。
HTMLを工夫すればJavaScriptなしでも可能です。

  • 入力の有無は required 属性、200文字チェックは pattern 属性(またはmaxlength属性)を利用可能。requiredpatternのような制約条件を満たさない状態では :invalid擬似クラスセレクタにマッチします。
  • :invalid に続く .error」というセレクタを使うために、<p class="error"><input>の後に移動する
  • :invalidを含むlabel に続く .error」というセレクタは現在書けないので、ラジオボタンの :invalid 状態を<fieldset>に伝播させてやる

html

1<div class="err_01"> 2<p>お名前<span>必須</span></p> 3<input value="" type="text" name="textbox1" required pattern=".{1,200}"> 4<p class="error">お名前をご入力ください!</p> 5</div> 6 7<div class="err_02"> 8<p>ふりがな<span>必須</span></p> 9<input value="" type="text" name="textbox2" required pattern=".{1,200}"> 10<p class="error">ふりがなをご入力ください!</p> 11</div> 12 13<div class="err_03"> 14<p>プレゼントを選んでください<span>必須</span></p> 15<fieldset> <!-- ラジオボタンの :invalid を受け継ぐ --> 16<label for="radio1_0"><input name="radio1" type="radio" id="radio1_0" value="0" required></label> 17<label for="radio1_1"><input name="radio1" type="radio" id="radio1_1" value="1"></label> 18<label for="radio1_2"><input name="radio1" type="radio" id="radio1_2" value="2"></label> 19</fieldset> 20<p class="error">プレゼントをお選びください!</p> 21</div>

css

1fieldset { 2 border: none; 3 margin: 0; 4 padding: 0; 5} 6.error { 7 display: none; 8} 9:invalid ~ .error { /*.onのかわり */ 10 ... 11} 12:invalid ~ .error::after {/*ふきだし*/ 13 ... 14}

投稿2021/03/26 16:21

編集2021/03/29 05:40
int32_t

総合スコア21008

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

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

halhalYam

2021/03/31 01:01

お礼が遅くなりすみません、ご回答ありがとうございます。 JavaScript無しでも似たような事が出来るんですね! もっと勉強が必要だと実感しました。
guest

0

ベストアンサー

javascript

1document.addEventListener('input',e=>{ 2 document.querySelectorAll('.error').forEach(x=>{ 3 let n; 4 if(n=x.closest('div').querySelector('input[type=text]')){ 5 x.classList.toggle('on',n.value==""); 6 } 7 if(x.closest('div').querySelector('input[type=radio]:checked')){ 8 x.classList.remove('on'); 9 } 10 }); 11}); 12

CSS

1.error:not(.on){display:none;}

投稿2021/03/26 10:32

編集2021/03/26 10:40
yambejp

総合スコア115010

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

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

halhalYam

2021/03/31 01:05

お礼が遅くなりすみません、ご回答ありがとうございます。 少ない記述で同じことが再現出来ていて、変更も簡単にでき非常に助かりました。 JavaScript、奥が深いです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問