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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2560閲覧

ラジオボタンが選択されていない場合、エラーテキストを表示させる

mochiko

総合スコア12

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2017/12/06 03:39

編集2017/12/06 04:54

ラジオボタンを使ってお問い合わせ内容の2種類どちらかを選択させる項目のあるフォームを制作しています。

その際に、お問い合わせ項目は必須にし、尚且つ選択がされていない場合、
項目の下に赤いテキストで「問い合わせ項目が選択されていません」と表示をさせたいのですが、
項目1と項目2どちらかを選択していてもエラー文が2つ表示されたりなど、
なかなか思うような組み方ができず、苦戦をしています…。

どなたかご教授いただけないでしょうか。

不慣れな組み方でお見苦しいのですが、下記がコードになります。

html

1<form> 2<label id="nameWrap" for="type">問い合わせ項目<span class="required">[必須]</span></label> 3 <div class="formWrap"> 4 <label><input type="radio" name="type" id="type1" value="項目1" data-err-txt="問い合わせ項目が選択されていません" required="required"><span>項目1</span></label> 5 <label><input type="radio" name="type" id="type2" value="項目2" data-err-txt="問い合わせ項目が選択されていません" required="required"><span>項目2</span></label> 6 </div> 7 <input name="submitBtn" id="submitBtn" type="submit" value="送信"> 8</form>

javascript

1$('#submitBtn').on('click', function (e){ 2 e.preventDefault(); 3 require = true; 4 $('.error').remove(); 5 $('[required="required"]:not(:disabled)').each(function (i, el){ 6 if ( ! $(el).val() || ( $(el).is('[type="radio"]') && ! $(el).is(':checked') ) ){ 7 require = false; 8 $(el).parents('.formWrap').append('<span class="error">'+ $(el).data('err-txt') +'</span>'); 9 } 10 }); 11 });

CSS

1span.error { 2 display: block; 3 color: #F00; 4 font-weight: bold; 5}

表示イメージとしては下記の図のようなものを想定しております。
イメージ説明

何卒よろしくお願いいたします。

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

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

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

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

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

yambejp

2017/12/06 04:11

エラーテキストが2つ設定されていて両方未選択であれば、2箇所にエラーがでる仕様になると思うのですが、最後にだけ表示したいのでしょうか?図示してもらえるとわかりやすいのですが
mochiko

2017/12/06 04:54

失礼いたしました。表示イメージを質問に追加いたしました。
yambejp

2017/12/06 04:59

回答したのとほぼおなじイメージなので回答の方を参照して下さい
mochiko

2017/12/06 05:02

ご回答ありがとうございました!参考にさせて実装したところ、想定していた表示がされました。迅速なご回答感謝いたします!
guest

回答2

0

ベストアンサー

ちょっと拡大解釈してこんな感じです

CSS

1.err{color:red;}

javascript

1$(function(){ 2 $('[type=submit]').on('click', function (e){ 3 var names=[]; 4 var f=$(this).closest('form'); 5 f.find('.err').remove(); 6 f.find('input[type=radio][required]:not(:checked)').each(function (){ 7 if(f.find('[name='+$(this).attr('name')+']').filter(':checked').length==0){ 8 names.push($(this).attr('name')); 9 } 10 }); 11 names.filter(function(x,i,self){return self.indexOf(x) === i;}).map(function(x){ 12 f.find('input[name='+x+']').last().closest('label').after( 13 $('<div>').text(f.find('input[name='+x+']').last().data('err-txt')).addClass('err') 14 ); 15 }); 16 17 }); 18});

HTML

1<form> 2<div> 3<label><input type="radio" name="t1" value="項目1" data-err-txt="問い合わせ項目が選択されていません" required>項目1</label> 4<label><input type="radio" name="t1" value="項目2" data-err-txt="問い合わせ項目が選択されていません" required>項目2</label> 5</div> 6<div> 7<label><input type="radio" name="t2" value="項目3" data-err-txt="問い合わせ項目が選択されていません" required>項目3</label> 8<label><input type="radio" name="t2" value="項目4" data-err-txt="問い合わせ項目が選択されていません" required>項目4</label> 9</div> 10<input type="submit" value="送信"> 11</form> 12<form> 13<div> 14<!-- フォームが違えば同じnameでもOK --> 15<label><input type="radio" name="t1" value="項目5" data-err-txt="問い合わせ項目が選択されていません" required>項目5</label> 16<label><input type="radio" name="t1" value="項目6" data-err-txt="問い合わせ項目が選択されていません" required>項目6</label> 17</div> 18<input type="submit" value="送信"> 19</form> 20

※ただしラジオボタンの同じnameの要素が必ずしも並んで存在するとはかぎらないので
場合によっては見た目がおかしくなると思います

投稿2017/12/06 04:35

編集2017/12/06 04:39
yambejp

総合スコア114839

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

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

0

今どきのブラウザはそれなりに検証できるので、required程度であれば任せてしまってもいいかもしれません。
https://caniuse.com/#search=invalid

JavaScript

1$('form input[type="radio"][name][data-err-txt]').on('invalid', function(event) { 2 this.setCustomValidity(this.validity.valid ? '' : this.getAttribute('data-err-txt')); 3}).on('change', function(event) { 4 $(this.form.elements[this.name]).each(function(index, element) { 5 element.setCustomValidity(''); 6 }); 7});

それでも好きな場所に好きなメッセージを出したいこともあるかもしれません。
その場合は何らかの方法でnameを保持すれば二重に出すことはなくなります。
(14:48判定修正)

JavaScript

1 $('[required="required"]:not(:disabled)').each(function (i, el){ 2 if (!el.validity.valid && !$(el).parents('.formWrap').find('[data-err-name="' + el.name + '"]').length) { 3 require = false; 4 var span = $('<span class="error"></span>'); 5 span.text($(el).data('err-txt')); 6 span.attr('data-err-name', el.name); 7 $(el).parents('.formWrap').append(span); 8 } 9 });

投稿2017/12/06 05:34

編集2017/12/06 05:49
x_x

総合スコア13749

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問