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

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

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

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

HTML

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

Q&A

2回答

1292閲覧

診断テストで問題を1問ずつ表示させる方法

unipulin

総合スコア0

JavaScript

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

HTML

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

0グッド

1クリップ

投稿2021/10/28 19:08

得点式の診断テストを作成しているのですが、いまの状態だと問題が1ページに全部表示されてしまっているので、1問回答すると前の問題が消えて次の問題が出て、最後にの5問目のところに評価のボタンを起きたいのですが、どうすればいいのでしょうか?また、1問ごとに画像を差し込みたいのですが(画像も次の問題が表示される時に変わるように)、方法が分かりません。お力を貸していただけると幸いです。

window.addEventListener('DOMContentLoaded', ()=>{ document.querySelector('#btn').disabled=true; document.querySelector('#btn').addEventListener('click',()=>{ const point=[...document.querySelectorAll('.q:checked')].map(x=>parseInt(x.value)).reduce((x,y)=>x+y); alert(point); }); }); document.addEventListener('change',()=>{ if(document.querySelectorAll('.q:checked').length>=5){ document.querySelector('#btn').disabled=false; } }); </script> <form> <fieldset> <legend>Q1</legend> <label><input type="radio" name="q1" class="q" value="10">A</label> <label><input type="radio" name="q1" class="q" value="5">B</label> </fieldset> <fieldset> <legend>Q2</legend> <label><input type="radio" name="q2" class="q" value="10">A</label> <label><input type="radio" name="q2" class="q" value="5">B</label> </fieldset> <fieldset> <legend>Q3</legend> <label><input type="radio" name="q3" class="q" value="10">A</label> <label><input type="radio" name="q3" class="q" value="5">B</label> </fieldset> <fieldset> <legend>Q4</legend> <label><input type="radio" name="q4" class="q" value="10">A</label> <label><input type="radio" name="q4" class="q"s value="5">B</label> </fieldset> <fieldset> <legend>Q5</legend> <label><input type="radio" name="q5" class="q" value="10">A</label> <label><input type="radio" name="q5" class="q" value="5">B</label> </fieldset> <input type="button" value="評価" id="btn"> </form>

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

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

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

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

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

guest

回答2

0

1問ごとに表示を変える場合は1問ごとに確定作業が必要です
一応最後に全部の回答履歴を表示するようにしておきました
(余計でしたら※1の行をコメントアウトしてください)

javascript

1<style> 2fieldset:not(.active),#btn:not(.active){ 3display:none; 4} 5</style> 6<script> 7window.addEventListener('DOMContentLoaded', ()=>{ 8 document.querySelector('fieldset').classList.add('active'); 9 document.querySelectorAll('.kakutei').forEach(x=>x.disabled=true); 10}); 11window.addEventListener('pageshow',()=>{ 12 const flg=window.performance.navigation.type; 13 if(flg==1){ // リロード対策 14 document.querySelectorAll('.q:checked').forEach(x=>x.checked=false); 15 document.querySelector('fieldset').classList.add('active'); 16 document.querySelectorAll('.kakutei').forEach(x=>x.disabled=true); 17 } 18}); 19document.addEventListener('click',(e)=>{ 20 const t=e.target; 21 if(t.closest('.kakutei')){ 22 t.disabled=true; 23 t.closest('fieldset').querySelectorAll('.q').forEach(x=>x.setAttribute("readonly",1)); 24 if(document.querySelectorAll('.q:checked').length>=5){ 25 document.querySelectorAll('fieldset').forEach(x=>x.classList.add('active'));//※1 26 const point=[...document.querySelectorAll('.q:checked')].map(x=>parseInt(x.value)).reduce((x,y)=>x+y); 27 alert(point); 28 }else{ 29 t.closest('fieldset').classList.remove('active'); 30 t.closest('fieldset').nextElementSibling.classList.add('active'); 31 } 32 } 33 if(t.closest('[readonly]')){ 34 e.preventDefault(); 35 } 36}); 37document.addEventListener('change',(e)=>{ 38 const t=e.target; 39 if(t.closest('.q')){ 40 t.closest('fieldset').querySelector('.kakutei').disabled=false; 41 } 42}); 43</script> 44<form> 45<fieldset> 46<legend>Q1</legend> 47<label><input type="radio" name="q1" class="q" value="10">A</label> 48<label><input type="radio" name="q1" class="q" value="5">B</label> 49<input type="button" value="確定" class="kakutei"> 50</fieldset> 51<fieldset> 52<legend>Q2</legend> 53<label><input type="radio" name="q2" class="q" value="10">A</label> 54<label><input type="radio" name="q2" class="q" value="5">B</label> 55<input type="button" value="確定" class="kakutei"> 56</fieldset> 57<fieldset> 58<legend>Q3</legend> 59<label><input type="radio" name="q3" class="q" value="10">A</label> 60<label><input type="radio" name="q3" class="q" value="5">B</label> 61<input type="button" value="確定" class="kakutei"> 62</fieldset> 63<fieldset> 64<legend>Q4</legend> 65<label><input type="radio" name="q4" class="q" value="10">A</label> 66<label><input type="radio" name="q4" class="q"s value="5">B</label> 67<input type="button" value="確定" class="kakutei"> 68</fieldset> 69<fieldset> 70<legend>Q5</legend> 71<label><input type="radio" name="q5" class="q" value="10">A</label> 72<label><input type="radio" name="q5" class="q" value="5">B</label> 73<input type="button" value="確定" class="kakutei"> 74</fieldset> 75</form>

※一部調整

投稿2021/10/29 00:48

編集2021/10/29 00:57
yambejp

総合スコア116724

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

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

yambejp

2021/10/29 00:58

画像はfieldset内におけば設問ごとに設置することができます
guest

0

各問題のラジオボタンが選択されたらその問題と次の問題のdisplayの値を変えて表示・非表示すればよいかと思います。

displayというのはCSSのプロパティで、要素の表示方法を指定することができます。
display: block;などで要素が表示され、display: none;で非表示になります。

display - CSS: カスケーディングスタイルシート | MDN

fieldsetをそれぞれdivで包んで、評価ボタンは最後の問題が含まれたdivに入れ、そのdivの表示・非表示を切り替えることにしましょう。

画像もそのdivの子要素にしておけば一緒に切り替わりますし、フェードインなどの切り替え時効果もそのdivにCSSを適用すればできます。

html

1<html> 2<head> 3 <!-- いろいろあって --> 4 <style> 5 /* 問題は基本非表示にする */ 6 .question { 7 display: none; 8 } 9 /* showクラスが付いている問題を表示するようにする */ 10 .question.show { 11 display: block; 12 } 13 </style> 14</head> 15<body> 16<!-- いろいろあって --> 17<form id="questions"> 18 <div class="question show"> 19 <fieldset> 20 <legend>Q1</legend> 21 <img alt="なにかの画像" src="画像のURL"> 22 <label><input type="radio" name="q1" class="q" value="10">A</label> 23 <label><input type="radio" name="q1" class="q" value="5">B</label> 24 </fieldset> 25 </div> 26 <div class="question"> 27 <fieldset> 28 <legend>Q2</legend> 29 <img alt="なにかの画像" src="画像のURL"> 30 <label><input type="radio" name="q2" class="q" value="10">A</label> 31 <label><input type="radio" name="q2" class="q" value="5">B</label> 32 </fieldset> 33 <input type="button" value="評価" id="btn"> 34 </div> 35</form> 36 37<script> 38// 問題を非表示にする関数 39function hide(question) { 40 // showクラスを削除 41 question.classList.delete("show"); 42} 43 44// 問題を表示する関数 45function show(question) { 46 // showクラスを追加 47 question.classList.add("show"); 48} 49 50window.addEventListener('load', () => { 51 // id="questions"の要素に含まれる問題を全て取得 52 const questions = Array.from(document.querySelectorAll("#questions .question")); 53 // 最後の問題以外の全ての選択肢に「変更があったら次の問題に切り替える」処理を追加する 54 questions.slice(0, -1).forEach((question, i) => { 55 // 各問題の選択肢を全て取得 56 const choices = question.querySelectorAll('.q'); 57 for (const choice of choices) { 58 // 選択肢が変更されたら 59 choice.addEventListener('change', _ev => { 60 // 現在の問題を非表示にして次の問題を表示 61 hide(questions[i]); 62 show(questions[i+1]); 63 }); 64 } 65 }); 66}); 67</script> 68</body> 69</html>

投稿2021/10/29 00:43

編集2021/10/29 01:05
fj68

総合スコア752

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問