You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript切换两个倒计时时出现重叠问题该如何解决?

问题根源

你现在的代码每次调用refillTimer都会生成一个新的setInterval定时器,但定时器ID仅保存在函数内部的局部变量x中,函数执行完毕后就无法获取到之前的定时器ID,无法清除旧定时器。多个定时器同时运行时都会修改同一个#refillTimer元素的内容,就会出现数值来回跳变的问题。

修复方案

核心逻辑

新增一个全局变量存储当前运行的定时器ID,每次调用refillTimer时先清除旧定时器,再启动新的定时器,保证全局始终只有一个倒计时实例运行。

完整修改后代码

// 全局变量存储当前运行的定时器ID
let currentTimer = null;

// COUNTDOWN TIMER
// 参数重命名为endTime避免和函数名冲突
function refillTimer(endTime){
  // 先清除之前运行的定时器
  if (currentTimer) {
    clearInterval(currentTimer);
    currentTimer = null;
  }

  var countDownDate = new Date(endTime).getTime();
  // 把新的定时器ID赋值给全局变量
  currentTimer = setInterval(function() {
    var now = new Date().getTime();
    var distance = countDownDate - now;
    var hours = ("0" + Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))).slice(-2);
    var minutes = ("0" + Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60))).slice(-2);
    var seconds = ("0" + Math.floor((distance % (1000 * 60)) / 1000)).slice(-2);
    document.getElementById("refillTimer").innerHTML = hours + ":" + minutes + ":" + seconds;
    if(distance < 0){
      clearInterval(currentTimer);
      currentTimer = null;
      document.getElementById("refillTimer").innerHTML = "00:00:00";
    }
  }, 1000);
}

// ON SWIPE PERFORM ACTION
async function swipeAction(currentElementObj, swipeType) {
  var cardId = currentElementObj.getAttribute("value");
  var dataString = {
    card: cardId,
    swipe: swipeType
  };
  // 补全原代码缺失的Promise resolve逻辑,避免函数一直处于等待状态
  let response = await new Promise((resolve, reject) => {
    try {
      var xhr = new XMLHttpRequest();
      xhr.open("POST", "processes/swipe.php", true);
      xhr.setRequestHeader("Content-Type", "application/json");
      xhr.responseType = "json";
      xhr.send(JSON.stringify(dataString));
      xhr.onreadystatechange = function () {
        let resObj = xhr.response;
        if(xhr.readyState == 4) {
          if(xhr.status == 200 && resObj) {
            if(resObj.action == 'gameover'){
              refillTimer(resObj.nextgameoverTimer);
            }else if(resObj.action == 'killsalloted'){
              refillTimer(resObj.nextkillsallotedTimer);
            }
            resolve(resObj);
          } else {
            reject(new Error('请求失败'));
          }
        }
      };
    }catch(e){
      reject(e.toString());
    }
  });
}

内容的提问来源于stack exchange,提问作者Relaxing Music

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 10:54:03