如何修改现有JavaScript计时器代码使其在数值为0时停止而非继续递减为负数
解决计时器到0停止的问题
你的问题出在递减逻辑的顺序以及初始调用的判断缺失上。原代码里,decrement函数会先把current减1,再判断是否继续——这就导致当current原本是0时,会被减到-1,然后继续触发下一次递减;而且不管初始值是不是0,都会触发第一次decrement调用。
下面是修改后的完整代码,已经实现到0停止的功能:
function animateValue(id) { var obj = document.getElementById(id); var current = +localStorage.getItem('counter') || +obj.innerHTML; obj.innerHTML = current; function decrement(){ // 只有当current大于0时才执行递减 if(current > 0){ --current; obj.innerHTML = current; localStorage.setItem('counter', current); // 递减后如果还没到0,继续设置下一次定时器 if(current != 0){ setTimeout(decrement, (Math.floor(Math.random()*11) + 10) * 1000); } } } // 初始时只有current大于0,才启动定时器 if(current > 0){ setTimeout(decrement, (Math.floor(Math.random()*11) + 10) * 2000); } } animateValue('counter');
修改要点说明:
- 在
decrement函数内部,先判断current > 0再执行递减操作,避免把0变成负数。 - 初始调用定时器前,先检查
current > 0,如果初始值就是0,直接不启动递减流程。 - 保留了你原本的随机间隔逻辑,只是调整了判断时机,确保只有在数值还没到0的时候才继续执行。
你之前尝试的if (seconds === 0) { stop(); }没生效,是因为代码里既没有seconds变量,也没有定义stop()函数,而且判断时机也不对——应该在递减前就检查是否已经到0,而不是之后。
内容的提问来源于stack exchange,提问作者Filippo Caruso
相关产品推荐
相关产品推荐

