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

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

ただいまの
回答率

88.92%

3つのラジオボタンを選択し、「説明を見る」ボタンを押すと3つの説明が出るプログラムを作りたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 167

Keichi_Negishi

score 10

最終的に実現したい事

グループ1からグループ3までのラジオボタンを選択し、「説明を見る」ボタンを押すと、ボタンの下に、ラジオボタンのグループに対応した文章が3つ出てくるようにしたいです。

実現したい事&困っている事

(1)3つのラジオボタンを選択すると「説明を見る」ボタンのdisabledが解除される様にしたいのですが、1つのラジオボタンを選択しただけでdisabledが解除されてしまいます。
if(group1 != "" && group2 != "" && group3 != "")←これが機能していない理由が分かりません。

(2)「説明を見る」ボタンを押して下の方に説明が表示されている間は、ラジオボタンを選択できないようにしたいのですが、選択できてしまいます。なぜdisabledが効かないのでしょうか。

<追記>
・表示された説明は、それで1セットというイメージです。
既に表示された説明はリセットボタンを押さない限り、変更できないようにしたいです。
イメージ説明
イメージ説明

ご教示いただけますと幸いです。
よろしくお願いいたします。

<!--中略 -->
    <div class="decide_wrapper">
      <div class="decide_area">
        <h2 class="decide_hd">テストタイトル</h2>
        <div class="decide_inner">
          <div class="decide_block">
            <h3 class="number_1">グループ1の見出し</h3>
            <div class="radio_block radio_block_1">
              <div class="radio_block_inner">
                <label class="radio_title"><input class="radio" type="radio" name="group_1" value="1_a">選択肢1</label>
                <label class="radio_title"><input class="radio" type="radio" name="group_1" value="1_b">選択肢2</label>
                <label class="radio_title"><input class="radio" type="radio" name="group_1" value="1_c">選択肢3</label>
                <label class="radio_title"><input class="radio" type="radio" name="group_1" value="1_a">選択肢4</label>
                <label class="radio_title"><input class="radio" type="radio" name="group_1" value="1_b">選択肢5</label>
              </div><!--/.radio_block_inner -->
            </div><!--/.radio_block -->
          </div><!--/.decide_block -->

          <div class="decide_block">
            <h3 class="number_2">グループ2の見出し</h3>
            <div class="radio_block radio_block_2">
              <div class="radio_block_inner">
                <label class="radio_title"><input class="radio" type="radio" name="group_2" value="2_a">選択肢1</label>
                <label class="radio_title"><input class="radio" type="radio" name="group_2" value="2_b">選択肢2</label>
                <label class="radio_title"><input class="radio" type="radio" name="group_2" value="2_a">選択肢3</label>
                <label class="radio_title"><input class="radio" type="radio" name="group_2" value="2_b">選択肢4</label>
                <label class="radio_title"><input class="radio" type="radio" name="group_2" value="2_b">選択肢5</label>
                <p class="caution">※注意点</p>
              </div><!--/.radio_block_inner -->
            </div><!--/.radio_block -->
          </div><!--/.decide_block -->

          <div class="decide_block">
            <h3 class="number_3">グループ3の見出し</h3>
            <div class="radio_block radio_block_3">
              <div class="radio_block_inner">
                <label class="radio_title"><input class="radio" type="radio" name="group_3" value="3_a">選択肢1</label>
                <label class="radio_title"><input class="radio" type="radio" name="group_3" value="3_b">選択肢2</label>
                <label class="radio_title"><input class="radio" type="radio" name="group_3" value="3_c">選択肢3</label>
                <label class="radio_title"><input class="radio" type="radio" name="group_3" value="3_b">選択肢4</label>
                <p class="caution">※注意点</p>
              </div><!--/.radio_block_inner -->
            </div><!--/.radio_block -->
          </div><!--/.decide_block -->
        </div><!--/.decide_inner -->

      <div class="btn_flex">
        <input type="button" class="btn result_btn disabled" value="説明を見る"></button>
        <input type="button" class="btn reset_btn" value="リセットする"></button>
      </div><!--/.btn_flex -->
      <p class="explain">ボタンを押すと、上記のチェックに応じた内容が表示されます。</p><!--/.explain -->
    </div><!--/.decide_area -->
    </div><!--/.decide_wrapper -->

    <div class="plan_wrapper">
      <h2 class="plan_hd">テスト</h2>
      <div class="plan_area">
        <div class="plan_block plan_1_a">
          <div class="contents">
            <h3 class="number_1">グループ1</h3>
            <div class="text_block">
                <h4 class="text_hd">plan_1_aの見出し</h4>
                <p class="text">plan_1_aダミーテキスト</p>
              </div><!--/.text_block -->
          </div><!--/.contents -->
          <p class="contents_img"><img src="images/image_sample.jpg" alt="サンプル画像"></p>
        </div><!--/.plan_block -->

        <div class="plan_block plan_1_b">
          <div class="contents">
            <h3 class="number_1">グループ1</h3>
            <div class="text_block">
                <h4 class="text_hd">plan_1_bの見出し</h4>
                <p class="text">plan_1_bダミーテキスト</p>
              </div><!--/.text_block -->
          </div><!--/.contents -->
          <p class="contents_img"><img src="images/image_sample.jpg" alt="サンプル画像"></p>
        </div><!--/.plan_block -->

        <div class="plan_block plan_2_a">
          <div class="contents">
            <h3 class="number_2">グループ2</h3>
            <div class="text_block">
                <h4 class="text_hd">plan_2_a見出し</h4>
                <p>plan_2_aダミーテキスト</p>
              </div><!--/.text_block -->
          </div><!--/.contents -->
          <p class="contents_img"><img src="images/image_sample.jpg" alt="サンプル画像"></p>
        </div><!--/.plan_block -->
      </div><!--/.plan_area -->
    </div><!--/.plan_wrapper -->
  </section><!--/.dm_wrapper -->
<!--中略 -->
.decide_wrapper{
  width: 1200px;
  padding: 0 20px 80px;
  margin: 0 auto;
}

.decide_wrapper .decide_area{
  border: 1px solid #333;
  padding: 80px 0;
  width: 100%;
}

.decide_wrapper .decide_hd{
  text-align: center;
  padding-bottom: 80px;
  font-size: 30px;
  font-weight: 500;
}

.decide_wrapper .decide_inner{
  display: flex;
}

.decide_wrapper .decide_block{
  width: 25%;
  max-width: 290px;
  padding: 0 50px 0 40px;
  border-right: 1px solid #333;
  margin-bottom: 60px;
}
.decide_wrapper .radio_title{
  display: block;
  width: 100%;
  margin-bottom: 20px;
}

.decide_wrapper .caution{
  font-size: 12px;
  line-height: 20px;
}

.decide_wrapper .btn_flex{
  display: flex;
  justify-content: center;
  margin-bottom: 30px;
}

.decide_wrapper .btn_flex .btn{
  margin: 0;
}

.decide_wrapper .explain{
  text-align: center;
  font-weight: 500;
}

.disabled{
  border: 1px solid #ccc;
}

.disabled:hover{
  background: none;
  border: 1px solid #ccc;
  color: #ccc;
}

.plan_wrapper{
  width: 1200px;
  margin: 0 auto;
  padding: 0 20px;
}

.plan_wrapper .plan_hd{
  font-size: 30px;
  font-weight: 500;
  padding-bottom: 70px;
  text-align: center;
}

.plan_wrapper .plan_block{
  margin-bottom: 40px;
  padding-bottom: 40px;
  border-bottom: 1px solid #333;
  transition: .6s;
  display: flex;
}

.plan_wrapper .number_2,
.plan_wrapper .number_3{
  padding-left: 30px;
}

.plan_wrapper .number_1::before{
  content: '01';
  color: #f5f3e2;
  font-family: 'EB Garamond', serif;
  font-size: 160px;
  font-weight: 400;
  position: absolute;
  top: 0;
  left: 0;
  z-index: -1;
}

.plan_wrapper .number_2::before{
  content: '02';
  color: #f5f3e2;
  font-family: 'EB Garamond', serif;
  font-size: 160px;
  font-weight: 400;
  position: absolute;
  top: 0;
  left: 0;
  z-index: -1;
}

.plan_wrapper .number_3::before{
  content: '03';
  color: #f5f3e2;
  font-family: 'EB Garamond', serif;
  font-size: 160px;
  font-weight: 400;
  position: absolute;
  top: 0;
  left: 0;
  z-index: -1;
}

.plan_wrapper .contents{
  display: flex;
  align-items: flex-start;
}

.plan_wrapper .text_block{
  width: 570px;
}

.plan_wrapper .contents_img{
  margin-left: auto;
}
$(function(){

var planWrapper = $(".plan_wrapper");
var planBlock = $(".plan_wrapper .plan_block");
var planHd = $(".plan_wrapper .plan_hd");
var resultBtn = $(".result_btn");
var resetBtn = $(".reset_btn");
var radioBtn =$(".radio");

var group1;
var group2;
var group3;

//表示結果の文章は最初は隠しておく
planHd.hide();
planBlock.hide();

//disabledの付与
resultBtn.prop('disabled',true);
radioBtn.prop('disabled',false);

//リセットボタン
resetBtn.on('click',function(){
  location.reload();
});

//ラジオボタンが選択されたのを検知。
$("input:radio").change(function(){
  //選択されたラジオボタンの値を取得。
  group1 = $('input:radio[name="group_1"]:checked').val();
  group2 = $('input:radio[name="group_2"]:checked').val();
  group3 = $('input:radio[name="group_3"]:checked').val();

 //3つのラジオボタン全てが選択された場合のみ、disabledを解除
 if(group1 != "" && group2 != "" && group3 != ""){
  resultBtn.prop('disabled', false);
  resultBtn.removeClass('disabled');
  console.log('成功');
  }else{
    console.log('失敗');
  }

});

//結果を見るボタンを押したときの処理
resultBtn.on('click',function(){

  if(resultBtn.prop('disabled',true)){
      $(this).prop('disabled', true);
      $(this).addClass('disabled');
  }

  if(radioBtn.prop('disabled',false)){
    $(this).prop('disabled',true);
  }

    scrollBy(0,600);

    //ラジオボタンの値と一致したら、対応する文章をブラウザに表示
    if(group1 == '1_a'){
      $(".plan_1_a").fadeIn(1000);
    }

    if(group1 == '1_b'){
      $(".plan_1_b").fadeIn(1000);
    }

    if(group1 == '1_c'){
      $(".plan_1_c").fadeIn(1000);
    }

    if(group2 == '2_a'){
      $(".plan_2_a").fadeIn(1000);
    }

    if(group2 == '2_b'){
      $(".plan_2_b").fadeIn(1000);
    }

    if(group3 == '3_a'){
      $(".plan_3_a").fadeIn(1000);
    }

    if(group3 == '3_b'){
      $(".plan_3_b").fadeIn(1000);
    }

    if(group3 == '3_c'){
      $(".plan_3_c").fadeIn(1000);
    }

    planWrapper.css('margin','0 auto 160px');

});


});
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

1に関してはgroup1~3に代入した直後にconsole.logで確認してみるとわかります。
中身は空白ではなくundefined(未定義)になっているはずです。
なので比較はundefined以外になります。
*0などがvalueの候補にないなら普通に group1 && group2 && group3でいい気がしますが

2はpropの使い方が間違っています。
if文の中でradioBtn.prop('disabled',false)を実行していますがこれですとradioBtnのdisabledにfalseをセットすることになります。radioBtn.prop('disabled')で取得した値をfalseと比較しましょう。
*ここも別に比較でチェックしなくてもボタン押した時点でradioBtn.prop('disabled',true)ですべて使用不可でいいような気がしますが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/13 15:08

    (1)おおー、確かにundefinedになっていますね!

    (2)>radioBtnのdisabledにfalseをセットすることになります。
    無い値に対してfalseをセットしようとしていた事になるんですね。
    if文で無理に比較する必要も無い事もあるんですね。

    大変助かりました。ご丁寧に回答して頂きありがとうございます!

    キャンセル

+1

CSSだけでやったサンプル

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/13 14:18

    コードの記述ありがとうございます。

    私がやりたい事とは少し違うようです。上手く伝わっておらず申し訳ありません。

    質問にも追記しましたが、3つの文章で1セットというイメージです。
    画面に表示された説明は、リセットボタンを押さない限り変更できないようにしたいです。

    よろしくお願いします。

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る