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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Q&A

解決済

2回答

455閲覧

【Javascript】input type="checkbox"でcheckedになった数を計測し、type="radio"では回答に応じて点数を与え、合計値を算出したい

shin12t

総合スコア25

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

0グッド

1クリップ

投稿2022/06/02 16:13

編集2022/06/03 00:59

input type="checkbox"でcheckedになった数を計測し、type="radio"では回答に応じて点数を与え、合計値を算出したい

html

1 2<div class="q1"> 3 <p>Bobが好きな乗り物はなんでしょう?</p> 4 <div> 5 <input type="radio" id="bike" name="vehicle" value="1"> 6 <label for="bike">バイク(1点)</label> 7 </div> 8 <div> 9 <input type="radio" id="scooter" name="vehicle" value="2"> 10 <label for="scooter">スクーター(2点)</label> 11 </div> 12 <div> 13 <input type="radio" id="car" name="vehicle" value="3"> 14 <label for="car">車(3点)</label> 15 </div> 16 <div> 17 <input type="radio" id="train" name="vehicle" value="1"> 18 <label for="train">電車(1点)</label> 19 </div> 20</div> 21 22<div class="q2" hidden> 23 <p>Bobが好きな色は何色でしょう?</p> 24 <div> 25 <input type="checkbox" id="black" name="color"> 26 <label for="black"></label> 27 </div> 28 <div> 29 <input type="checkbox" id="white" name="color"> 30 <label for="white"></label> 31 </div> 32 <div> 33 <input type="checkbox" id="blue" name="color"> 34 <label for="blue"></label> 35 </div> 36 <div> 37 <input type="checkbox" id="yellow" name="color"> 38 <label for="yellow">黄色</label> 39 </div> 40</div> 41<button id="select">ポイント獲得数</button> 42</div>

JavaScript

1document.getElementById('select').onclick = function() { 2 var checkboxes = document.querySelectorAll('input[type="checkbox"]:checked'); 3 alert(checkboxes.length); 4}

結果の例)
Q1
車を選択→3点
Q2
黒と白を選択→2点(各1点)

合計 5点


初心者なりに色々調べた結果、この方法だとinputのタイプに応じてチェックした数を計測できることがわかりました。
しかし、チェックした回答に応じて点数を数値化して与える方法がわかりません。
inputにvalueなどで対応できるのでしょうか?

また、他にも実装してみたい挙動があり、以下の通りです。
ご回答いただけるととても助かります。

チェック前の項目は非表示→チェック後次の項目のみを表示したい

例)
最初はQ1のみ表示→Q1が回答されたら自動でQ2が表示され、Q1は消える

buttonを使わずに、チェックを終えたら自動でチェックリストの下に合計点数に応じたコンテンツを表示したい

例)
チェックボックス 2個
ラジオボタンの得点 3点
合計 5点(「おめでとう!5点獲得です」という画像を表示する)
※コードや数値ではなく画像で表したい

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

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

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

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

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

int32_t

2022/06/02 22:21

1つの質問で複数のことを聞くと回答を書く手間が増えるので、できるだけ1つのことだけ聞くようにしてください。
shin12t

2022/06/03 01:20

わかりました! ありがとうございます!
guest

回答2

0

ベストアンサー

javascript

1<style> 2fieldset:not(.active){ 3display:none; 4} 5</style> 6<script> 7document.addEventListener('click',e=>{ 8 const t=e.target; 9 if(t.matches('fieldset .next')){ 10 const f=t.closest('fieldset'); 11 f.classList.remove('active'); 12 f.nextElementSibling.classList.add('active'); 13 } 14 point.textContent=[...document.querySelectorAll('input:checked')].map(x=>Number(x.value)).reduce((x,y)=>x+y,0); 15}); 16</script> 17<form> 18<fieldset class="active"> 19<legend>Bobが好きな乗り物はなんでしょう?</legend> 20<ul> 21<li><label><input type="radio" name="vehicle" value="1">バイク(1点)</label></li> 22<li><label><input type="radio" name="vehicle" value="2">スクーター(2点)</label></li> 23<li><label><input type="radio" name="vehicle" value="3">車(3点)</label></li> 24<li><label><input type="radio" name="vehicle" value="1">電車(1点)</label></li> 25</ul> 26<input type="button" value="次へ" class="next"> 27</fieldset> 28<fieldset> 29<legend>Bobが好きな色は何色でしょう?</legend> 30<ul> 31<li><label><input type="checkbox" name="color" value="1"></label></li> 32<li><label><input type="checkbox" name="color" value="1"></label></li> 33<li><label><input type="checkbox" name="color" value="1"></label></li> 34<li><label><input type="checkbox" name="color" value="1">黄色</label></li> 35</ul> 36<input type="button" value="次へ" class="next"> 37</fieldset> 38<fieldset> 39<legend>結果</legend> 40<span id="point"></span> 41</fieldset></form>

画像で処理

javascript

1<style> 2fieldset:not(.active){ 3display:none; 4} 5</style> 6<script> 7document.addEventListener('click',e=>{ 8 const t=e.target; 9 if(t.matches('fieldset .next')){ 10 const f=t.closest('fieldset'); 11 f.classList.remove('active'); 12 f.nextElementSibling.classList.add('active'); 13 } 14 const num=[...document.querySelectorAll('input:checked')].map(x=>Number(x.value)).reduce((x,y)=>x+y,0); 15 point.src=num+".jpg"; 16 point.alt=num; 17}); 18</script> 19<form> 20<fieldset class="active"> 21<legend>Bobが好きな乗り物はなんでしょう?</legend> 22<ul> 23<li><label><input type="radio" name="vehicle" value="1">バイク(1点)</label></li> 24<li><label><input type="radio" name="vehicle" value="2">スクーター(2点)</label></li> 25<li><label><input type="radio" name="vehicle" value="3">車(3点)</label></li> 26<li><label><input type="radio" name="vehicle" value="1">電車(1点)</label></li> 27</ul> 28<input type="button" value="次へ" class="next"> 29</fieldset> 30<fieldset> 31<legend>Bobが好きな色は何色でしょう?</legend> 32<ul> 33<li><label><input type="checkbox" name="color" value="1"></label></li> 34<li><label><input type="checkbox" name="color" value="1"></label></li> 35<li><label><input type="checkbox" name="color" value="1"></label></li> 36<li><label><input type="checkbox" name="color" value="1">黄色</label></li> 37</ul> 38<input type="button" value="次へ" class="next"> 39</fieldset> 40<fieldset> 41<legend>結果</legend> 42<img id="point" src="0.jpg" alt="0"> 43</fieldset> 44</form>

投稿2022/06/03 00:57

編集2022/06/03 02:53
yambejp

総合スコア114839

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

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

shin12t

2022/06/03 01:15

int32_tさんにご回答いただいたような <input type="button" value="次へ" class="next"> を使わずに画面遷移することは可能ですか? document.querySelector('.q1').addEventListener('change', e => { document.querySelector('.q2').hidden = false; }); また、下記のように得点の表示を画像で出し分けたいのですが、どうしたら良いでしょうか? 例) 得点 1〜3点=img1 得点 3〜4点=img2 得点 5点=img3
yambejp

2022/06/03 01:19

「次へ」を使わないというのは理論上ありえません 択一のラジオボタンならまだわかりますが、それでも選び直しができないのは ユーザビリティが低いです。 ましてやチェックボックスは選んだ瞬間先にすすむと複数選べません
shin12t

2022/06/03 01:21

そうですよね・・・。 画像の出し分けについてはいかがでしょうか?
yambejp

2022/06/03 01:26

画像は最初から全点数分用意していて、点数にあわせた画像を表示すればいいのでは? <span id="point"></span>を <img src="0.jpg" id="point">のように変更し point.textContentではなく、point.src=〇〇+".jpg" のようにするとか
shin12t

2022/06/03 01:57 編集

javascript内で画像を複数枚指定するということでしょうか?
yambejp

2022/06/03 02:38 編集

> javascript内で画像を複数枚指定するということでしょうか? ちょっとおっしゃっている意味がわかりかねます。 画像で表示するということは画像は質問者さんが用意するということですよね? 仮に命題の内容だと0~7点の画像が必要です(0.jpg、1.jpg・・・・、7.jpg) 点数にあわせてimgのsrcに指定する画像名を変更して表示してくださいということです。
shin12t

2022/06/03 02:45 編集

すみません・・・。 単純にpoint.src=〇〇+".jpg"で記述する際の全体的な記述方法がわからずでして・・・。 合計点数に応じた画像の変え方をコードで見せていただけないでしょうか?
yambejp

2022/06/03 02:53

追記しました。これでわかりますか? しつこいようですが必要な画像を用意するのは質問者さんですから
shin12t

2022/06/03 02:58

>しつこいようですが必要な画像を用意するのは質問者さんですから はい、こちらは承知しております! 毎度質問の意図が分かりづらい投稿でもご回答いただき大変感謝しております・・・! ありがとうございます!!!
guest

0

チェックした回答に応じて点数を数値化

なんとかして選択肢と点数の対応付けが必要になりますね。
この質問のコードように選択肢が直接HTMLに書いてあるなら、点数もHTMLに含めてしまいましょう。下の例では data-point というカスタムデータ属性を足しています。集計するときは、チェックされている要素の data-point 属性の値を合計すればよいでしょう。

html

1<input type="radio" id="bike" name="vehicle" value="2" data-point="1"> 2<label for="bike">バイク(1点)</label> 3</div> 4<div> 5<input type="radio" id="scooter" name="vehicle" value="3" data-point="2"> 6<label for="scooter">スクーター(2点)</label>

選択肢が何かのデータから生成されるものなら、そのデータに点数も含めるといいです。


チェック前の項目は非表示→チェック後次の項目のみを表示したい

Q2 以降は最初から hidden 属性を付けておいて、Q1の選択肢で change イベントが起きたら Q2 の hideen 属性を消しましょう。

html

1<div class="q2" hidden>

Js

1document.querySelector('.q1').addEventListener('change', e => { 2 document.querySelector('.q2').hidden = false; 3});

buttonを使わずに、チェックを終えたら自動でチェックリストの下に合計点数に応じたコンテンツを表示したい

documentなど、すべての選択肢の祖先となるノードでchangeイベントを監視して、そこで集計すればいいです。

js

1document.addEventListener('change', e => { 2 const checked = [...document.querySelectorAll('input:checked')]; 3 // checked 内の各 <input> の data-point 属性値を合計して、どこかに表示する 4});

投稿2022/06/02 22:15

int32_t

総合スコア20882

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問