JavaScript DOM测验计时器:计时到0后进入负数问题排查
问题分析与解决
你的计时器跑到负数的核心问题出在停止条件的判断上:
if (secondsLeft === 0 && quizQuestions[5]) {
这个条件要求同时满足两个条件才会触发计时器停止:
secondsLeft等于0quizQuestions[5]为真值(比如数组长度足够、该位置元素不是null/undefined/false等)
如果quizQuestions数组长度不足6,或者索引5的元素是假值,这个if语句就不会执行,clearInterval也就不会被调用,计时器会继续执行secondsLeft--,自然就变成负数了。
修正方案
把判断条件简化,只保留时间相关的判断(用<= 0是为了覆盖意外情况导致secondsLeft直接跳到负数的场景),去掉多余的quizQuestions[5]判断:
let secondsLeft = 60; function setTime() { let timerInterval = setInterval(function() { secondsLeft--; // 先判断是否超时,再处理后续逻辑 if (secondsLeft <= 0) { timeEl.textContent = "Quiz over"; clearInterval(timerInterval); dNone(); questionText.innerHTML = "Do you wanna give it another try?"; return; // 提前退出,避免执行后续的剩余时间文本更新 } timeEl.textContent = secondsLeft + " seconds left till Quiz Ends"; }, 1000); // 保留这个超时兜底,防止上面的判断逻辑失效 setTimeout(function() { clearInterval(timerInterval); }, 61000); }
另外调整了代码顺序:先判断是否超时,再更新剩余时间文本,避免最后一次循环还显示负数的时间。
内容的提问来源于stack exchange,提问作者Roh
相关产品推荐
相关产品推荐

