#javascript #html #css
#javascript #HTML #css
Вопрос:
У меня возникли некоторые проблемы с правильной запуском моего приложения. Это простое приложение с простым таймером обратного отсчета. Моя проблема в том, что когда я хочу сбросить игру (перезагрузить страницу), когда setInterval()
она запущена, она работает. Но, если setInterval()
остановлено clearInterval()
и отображается мой элемент Game Over, если я нажму сброс, ожидая вызова location.reload()
, страница АВТОМАТИЧЕСКИ снова запускает таймер. Это какая-то проблема с циклом, которую я, похоже, не могу найти, но, может быть, вы, профессионалы, сможете обнаружить ошибку в моем коде.
Я пытался провести рефакторинг своего кода несколькими способами, чтобы изолировать ошибку, но, похоже, я не могу ее найти.
// DOM ELEMENTS ========================================================
const startReset = document.getElementById("startReset");
const scoreValue = document.getElementById("score");
const timer = document.getElementById("timer");
const timerValue = document.getElementById("timerValue");
const gameOver = document.getElementById("gameOver");
const correct = document.getElementById("correct");
const wrong = document.getElementById("correct");
// GLOBAL GAME VARIABLES ===============================================
let playing = false;
let score;
let action;
let timeRemaining;
// GAME OPERATIONS =====================================================
// Start/Reset Game
startReset.onclick = function() {
// Reset Game
if(playing === true) {
// Reload page
location.reload();
}
// Start Playing
else {
// Change mode from not playing to playing
playing = true;
// Take Away Game Over Element
gameOver.style.visibility = "hidden";
// Change start button to reset button
startReset.innerHTML = "Reset Game";
// Put score back to 0
score = 0;
// Update HTML with score
scoreValue.innerHTML = score;
// Display timer
timer.style.display = "block";
timeRemaining = 60;
// Start Countdown
startCountdown();
}
}
// Start Countdown Function
const startCountdown = () => {
// Set timer
action = setInterval(function(){
// reduce time by 1 sec
timeRemaining -= 1;
// update html
timerValue.innerHTML = timeRemaining;
// check if time is out
if(timeRemaining === 0) {
stopCountdown();
gameOver.style.visibility = "visible";
timer.style.display = "none";
correct.style.display = "none";
wrong.style.display = "none";
playing = false;
}
}, 100);
};
// Stop Countdown Function
const stopCountdown = () => {
clearInterval(action);
};
=============================================================
<body>
<div id="logoContainer">
<img src="./images/gotLogo.png">
</div>
<div id="container">
<div id="scoreCounter">
Score: <span id="score">0</span>
</div>
<div id="correct">Correct</div>
<div id="wrong">Try Again</div>
<div id="question">
<p>Click Start to Begin!</p>
</div>
<div id="instruction">
Click on the correct answer!
</div>
<div id="choices">
<div id="choice1" class="choice"></div>
<div id="choice2" class="choice"></div>
<div id="choice3" class="choice"></div>
<div id="choice4" class="choice"></div>
</div>
<div id="startReset">
Start Game
</div>
<div id="timer">
Time Remaining: <span id="timerValue">60</span> sec
</div>
<div id="gameOver">
<p>GAME OVER!</p>
<p>YOUR SCORE IS: <span id="finalScore">0</span></p>
</div>
</div>
<script src="app.js" type="text/javascript"></script>
</body>
</html>
Я ожидаю, что нажатие на сброс игры после Game Over
появления перезагрузит страницу и заставит новый щелчок запустить игру, однако он перезагружает страницу и АВТОМАТИЧЕСКИ перезапускает таймер. Если я нажимаю Reset Game
во время работы таймера, он работает так, как ожидалось.
Ответ №1:
Ответ найден. Возможно, это поможет другим.
В моей функции startCountdown() в операторе if я изначально сбросил значение playing = false, что привело к замыканию моей условной логики для функции onclick, объявленной выше в разделе Запуск / сброс игры. Устранение этого позволило игре работать должным образом!