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

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

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

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

HTML

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

Q&A

解決済

1回答

2128閲覧

フォームのラジオボタンが反応しない

nakamitsu827

総合スコア1

jQuery

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

HTML

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

0グッド

0クリップ

投稿2021/10/10 13:57

前提・実現したいこと

2つあるうちのラジオボタンをどちらか選択したら、フォームの最後にあるsubmitボタンにis-activeクラスを付与したいのですが、1つ目のラジオボタンを選択したら正常にis-activeクラスがつくのですが、なぜか2つ目のラジオボタンを選択すると、is-activeクラスが取れてしまいます。

HTML

1 <form action="" class="contact-form" id="js-form"> 2 <div class="contact-form__radio contact-form__row"> 3 <div class="contact-form__label contact-form__label__3"> 4 <label><span>法人/個人の選択</span></label> 5 </div> 6 <div class="contact-form__radiobox"> 7 <label> 8 <input type="radio" name="yourRadio" class="contact-form__radio__button" value="法人" required checked> 9 <span>法人</span> 10 </label> 11 <label> 12 <input type="radio" name="yourRadio" class="contact-form__radio__button" value="個人" required> 13 <span>個人</span> 14 </label> 15 </div>Ï 16 </div> 17 <div class="contact-form__submit"> 18 <input type="submit" value="送信" class="contact-form__submit__button" id="contact-form__submit__button" disabled> 19 </div> 20 </form>

jQuery

1$(function () { 2 let $submit = $('#contact-form__submit__button'); 3 $('#js-form input,#js-form textarea').on('change',function () { 4 if ( 5 $('#js-form input[name="yourRadio"]').prop('checked') === true 6 ) { 7 $submit.addClass('is-active'); 8 $submit.prop('disabled',false); 9 } 10 else{ 11 $submit.removeClass('is-active'); 12 $submit.prop('disabled',true); 13 } 14 }); 15});

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

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

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

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

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

guest

回答1

0

ベストアンサー

javascript

1if ( 2 $('#js-form input[name="yourRadio"]').prop('checked') === true 3) { 4 ...

ここの$('#js-form input[name="yourRadio"]').prop('checked')
は常に最初の方のラジオボタン(法人のラジオボタン)のチェックの状態を見ています。

検証してみましょう。例のif文の上の行に、次の処理を追加して、検証ツールで値を確認してみましょう。

javascript

1$('#js-form input,#js-form textarea').on('change',function () { 2 // ↓これを追加してみましょー!タグのvalueの値を見ることができます 3 console.log($('#js-form input[name="yourRadio"]').val()) 4 5 if ( 6 $('#js-form input[name="yourRadio"]').prop('checked') === true 7 ) {

チェックボックスを切り替えてもコンソールに出力される値は絶対に「法人」になっていることを確認できると思います。
このことから、if文で評価されるラジオボタンは常に「法人」のラジオボタンになるので、

・ 法人をチェックしたらtrue => is-activeが追加され、ボタンが有効になる
・ 個人をチェックしたら法人のチェックが外れるのでfalse => is-activeが削除され、ボタンが無効になる

となります。これが現在発生している問題の真相です。

じゃあどうすればいいのでしょうか?いろいろやり方は思いつくところですが、一番シンプルなのは$.fn.oneを使う方法ではないでしょうか?$.fn.oneは、$.fn.onと同じようにイベントを定義するメソッドですが、1度しか発火しません。

これを使って書く場合、下記の通りになります。また、ラジオボックスのinputタグにcheckedをつけていると思いますが、これは外して初期状態は何も選択されていない状態にしましょう。

javascript

1$(function () { 2 // 値を変更する予定がない時はletではなくconstを使うことをお勧めします。 3 const $submit = $('#contact-form__submit__button'); 4 // ラジオボタンの状態が1回切り替わったらボタンを有効にする 5 $('#js-form input[type=radio]').one('change', () => { 6 $submit.addClass('is-active'); 7 $submit.prop('disabled',false); 8 }) 9})

投稿2021/10/10 16:27

ukyoda

総合スコア386

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

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

nakamitsu827

2021/10/10 17:07

とても丁寧に回答していただきありがとうございます! 確かに、web制作ではそこまでjQueryを書く量って少ないから、constで定義したほうがいいですね。 ukyodaさんのおっしゃるとおり、console.logで出力してみるたら、法人の方しか出力できませんでした。ですが、ukyodaさんが紹介してくださったoneメソッドというものを使ったら、解決できました! 本当にありがとうございました!勉強になりました。 あと自分でも、他に解決策がないか調べてみたら、if文の中身を「$("#js-form input[type='radio']:checked").prop('checked') === true」にしてみたら、一応反応するようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問