前提・実現したいこと
時間制限ありのクイズ問題を作成しているのですが、知識不足のため思ったように書くことができないので助けて欲しいです。
【大まかな流れ】
・ボタンクリックでクイズ画面に移動。
↓
・画面の切り替わり後に、タイマーが起動してクイズに答えることができる。
↓
・リザルトウィンドウを表示。
【教えて欲しい所】
クイズの問題に全て答えるか、
カウントダウンタイマーが0になるか、
のどちらかでリザルト画面を表示させたいのですが、書き方がわかりません。
main.js44行目のif(timeLeft < 0){}の中に書くのかな?と思い試していたのですが、解決できませんでした。
よろしくお願いします。
発生している問題
クイズの問題に全て答えるか、カウントダウンタイマーが0になるか、のどちらかでリザルト画面を表示させたいのですが、書き方がわからない
該当のソースコード
javascript
1 2{ 3 const btn = document.getElementById('btn'); 4 const timer = document.getElementById('timer'); //1 5 const sbtn = document.getElementById('sbtn'); //2 6 7 let startTime; //STARTボタンを押したときの時刻(宣言) 8 let timeLeft; //残り時間 9 const timeToCountDown = 3 * 1000; //1000 = 1秒 10 let timerId; //clearTimeoutの引数に渡す 11 12 13 function countDown() { // countDownの宣言 14 timerId = setTimeout (function() { 15 //timerIdをsetTimeoutの返り値として取得 次の処理を指定したミリ秒後に実行(1度だけ) 16 17 // const elapsedTime = Date.now() - startTime; 経過時間 = 現在時刻 - スタートした時間 18 // timeLeft = timeToCountDown - elapsedTime; 残り時間 = カウントダウン時間 - 経過時間 19 timeLeft = timeToCountDown - (Date.now() - startTime); 20 //elapsedTimeは、1度しか使わないので直接代入した↑ 21 22 if(timeLeft < 0){ //残り時間が0より小さくなったらclearTimeoutを呼ぶ(タイマー停止) 23 clearTimeout(timerId); 24 timeLeft = 0; //timeLeftを0にして、updateTimerで更新する 25 updateTimer(timeLeft); 26 return; //clearTimeout()したら次のcountDown()を呼び出したくないためreturnする 27 } 28 29 updateTimer(timeLeft); // 呼び出し(渡すミリ秒はtimerLeft) 30 countDown(); //countDownを再帰的に呼び出したいため、ここで呼ぶ。 31 }, 10); 32 } 33 34 sbtn.addEventListener('click', function() { //STARTボタンがクリックされたらタイマーON 35 startTime = Date.now(); // 押したときの時刻を取得 36 countDown(); /* カウントダウン機能は setTimeoutを使い再帰的に実行させるため countDown() という名前の別関数にする。*/ 37 }); 38 39 40 41 function setQuiz() { 42 isAnswered = false; 43 44 question.textContent = quizSet[currentNum].q; 45 46 while (choices.firstChild) { 47 choices.removeChild(choices.firstChild); 48 } 49 50 const shuffledChoices = shuffle([...quizSet[currentNum].c]); 51 shuffledChoices.forEach(choice => { 52 const li = document.createElement('li'); 53 li.textContent = choice; 54 li.addEventListener('click', () => { 55 checkAnswer(li); 56 }); 57 choices.appendChild(li); 58 }); 59 60 if (currentNum === quizSet.length - 1) { 61 btn.textContent = 'Show Score'; 62 } 63 64 } 65 66 setQuiz(); 67 68 btn.addEventListener('click', () => { 69 if (btn.classList.contains('disabled')) { 70 return; 71 } 72 btn.classList.add('disabled'); 73 74 if (currentNum === quizSet.length - 1) { 75 scoreLabel.textContent = `Score: ${score} / ${quizSet.length}`; 76 result.classList.remove('hidden'); 77 } else { 78 currentNum++; 79 setQuiz(); 80 } 81 }); 82} 83 84
試したこと
自分なりに試して書いていたのですが、解決できませんでした。
補足情報(FW/ツールのバージョンなど)
記述していただいたコードで解決できました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/28 09:11