実現したいこと:「戻る」ボタンを押すことで、直前に選択したラジオボタンの選択状態を解除し、ひとつずつ過去の状態にさかのぼれる機能を実装したい!
JavaScriptを独学し始めて1ヶ月ほどの超初心者ですm(_ _)m
現在、質問に回答するごとに正解の選択肢が絞られていく、**「アキネーター」**のようなプログラムを鋭意作成中です。
以下のスクリプトを活用し、「ZeroPossibility」クラスが付与された要素をCSSで非表示処理することによって、ユーザーが質問に答えるごとに正解となる選択肢が絞られていき、同時に尋ねる意義がなくなった質問も非表示になるプログラムが出来上がりました。
しかし、予期していなかった問題に気がつきました。それは、**「ユーザーが2個以上の選択を誤っていた場合に、一方をやり直すと結果が狂う」**ことです。
上記の回避策として、**「ひとつ前にいじったラジオボタンの選択状態を未選択状態に戻す」**ボタンの実装を思いついたのですが、どのようにコーディングすればよいのかわからずに困窮しております。
できれば、「一つ前に戻るボタン」を押す度に、何度でも直前にいじったラジオボタンの選択を解除できるようにしたいです。
なお、ユーザーが直前に、同じ質問の「はい」と「いいえ」を交互に切り替えていた場合は、「はい」や「いいえ」に戻す必要はないので、ただ選択を解除させたいです。
HTML
1<body> 2 3 <div id="Questions"><h1>質問</h1> 4 5 <div id="Q1"> 6 <p>Q. 動物ですか?</p> 7 <label><input type="radio" name="RadGrpA1" id="A1Yes">YES</label> 8 <label><input type="radio" name="RadGrpA1" id="A1No">No</label> 9 <label><input type="radio" name="RadGrpA1">わからない</label> 10 </div> 11 12 <div id="Q2"> 13 <p>Q. 首が長いですか?</p> 14 <label><input type="radio" name="RadGrpA2" id="A2Yes">YES</label> 15 <label><input type="radio" name="RadGrpA2" id="A2No">No</label> 16 <label><input type="radio" name="RadGrpA2">わからない</label> 17 </div> 18 19 <div id="Q3"> 20 <p>Q. 植物ですか?</p> 21 <label><input type="radio" name="RadGrpA3" id="A3Yes">YES</label> 22 <label><input type="radio" name="RadGrpA3" id="A3No">No</label> 23 <label><input type="radio" name="RadGrpA3">わからない</label> 24 </div> 25 26 <div id="Q4"> 27 <p>Q. トゲがありますか?</p> 28 <label><input type="radio" name="RadGrpA4" id="A4Yes">YES</label> 29 <label><input type="radio" name="RadGrpA4" id="A4No">No</label> 30 <label><input type="radio" name="RadGrpA4">わからない</label> 31 </div> 32 33 <div id="Q5"> 34 <p>Q. 人間ですか?</p> 35 <label><input type="radio" name="RadGrpA5" id="A5Yes">YES</label> 36 <label><input type="radio" name="RadGrpA5" id="A5No">No</label> 37 <label><input type="radio" name="RadGrpA5">わからない</label> 38 </div> 39 40 <div id="Q6"> 41 <p>Q. ミュージシャンですか?</p> 42 <label><input type="radio" name="RadGrpA6" id="A6Yes">YES</label> 43 <label><input type="radio" name="RadGrpA6" id="A6No">No</label> 44 <label><input type="radio" name="RadGrpA6">わからない</label> 45 </div> 46 47 </div> 48 49 <h1>可能性</h1> 50 <p id="Cabbage">キャベツ</p> 51 <p id="Cactus">サボテン</p> 52 <p id="Elephant">象</p> 53 <p id="Giraffe">キリン</p> 54 <p id="MichaelJackson">マイケルジャクソン</p> 55 <p id="NobunagaOda">織田信長</p> 56 57</body>
JavaScript
1document.getElementById("Questions").addEventListener("change", () => { 2 3 let Judge = {Cabbage:"", Cactus:"", Elephant:"", Giraffe:"", MichaelJackson:"", NobunagaOda:""}; 4 let JudgeArray = ["Cabbage", "Cactus", "Elephant", "Giraffe", "MichaelJackson", "NobunagaOda"]; 5 6 const ResponseAndProcess = [ 7 {Response:"A1Yes", Omit:["Cabbage","Cactus"]}, 8 {Response:"A1No", Omit:["Elephant","Giraffe","MichaelJackson","NobunagaOda"]}, 9 {Response:"A2Yes", Omit:["Cabbage","Cactus","Elephant","MichaelJackson","NobunagaOda"]}, 10 {Response:"A2No", Omit:["Giraffe"]}, 11 {Response:"A3Yes", Omit:["Elephant","Giraffe","MichaelJackson","NobunagaOda"]}, 12 {Response:"A3No", Omit:["Cabbage","Cactus"]}, 13 {Response:"A4Yes", Omit:["Cabbage","Elephant","Giraffe","MichaelJackson","NobunagaOda"]}, 14 {Response:"A4No", Omit:["Cactus"]}, 15 {Response:"A5Yes", Omit:["Cabbage","Cactus","Elephant","Giraffe"]}, 16 {Response:"A5No", Omit:["MichaelJackson","NobunagaOda"]}, 17 {Response:"A6Yes", Omit:["Cabbage","Cactus","Elephant","Giraffe","NobunagaOda"]}, 18 {Response:"A6No", Omit:["MichaelJackson"]}, 19 ]; 20 21 for (let i=0; i<ResponseAndProcess.length; i++) { 22 if (document.getElementById(ResponseAndProcess[i].Response).checked) { 23 for (let j=0; j<ResponseAndProcess[i].Omit.length; j++) { 24 Judge[ResponseAndProcess[i].Omit[j]] = "不正解"; 25 } 26 } 27 } 28 29 for (let i = 0; i < JudgeArray.length; i++) { 30 if (Judge[JudgeArray[i]] == "不正解") { 31 document.getElementById(JudgeArray[i]).classList.add("ZeroPossibility"); 32 } else { 33 document.getElementById(JudgeArray[i]).classList.remove("ZeroPossibility"); 34 } 35 } 36 37 document.querySelectorAll('#Questions > div').forEach(el => el.classList.remove("ZeroPossibility")) 38 const Possibilities = Object.entries(Judge).flatMap(e => e[1] === "不正解" ? [] : e[0]); 39 const ZeroPossibilityResponses = ResponseAndProcess.flatMap(e => Possibilities.every(x => !e.Omit.includes(x)) ? e.Response : []) 40 ZeroPossibilityResponses.forEach(opt => { 41 const $Options = document.getElementById(opt); 42 if(!$Options.checked){ 43 $Options.closest('div').classList.add('ZeroPossibility') 44 } 45 }); 46 47});
負んぶに抱っこですみませんが、皆様のお知恵を拝借できれば幸いです。どうぞよろしくお願いいたしますm(_ _)m
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/04 09:11