代码之家  ›  专栏  ›  技术社区  ›  AKAust

Javascript clearInterval没有效果?

  •  1
  • AKAust  · 技术社区  · 6 年前

    我正在尝试做一个简单的重定向后,x秒的一页上的倒计时计时器。每次调用函数时,我都希望计时器复位,但是当我第二次或第三次调用时,计时器似乎有3个不同的倒计时。有人知道这是为什么吗?

    function delayRedirect(){
      document.getElementById('countDown').innerHTML = 'Session Timeout In: <span id="countTimer"></span> seconds....';
      clearInterval(sessionTimer);
      var sessionTimer = null;
      var timeleft = 60;
      var sessionTimer = setInterval(function(){
         timeleft--;
         document.getElementById('countTimer').innerHTML = timeleft;
         if(timeleft <= 0)
             clearInterval(sessionTimer);
             returnToLogin();
         },1000);
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   kockburn    6 年前

    全局放置sessionTimer。当前所做的是每次输入delayRedirect时重新声明sessionTimer。

    工作示例:

    const but = document.getElementById("but");
    but.addEventListener("click", delayRedirect);
    
    //define it globally
    var sessionTimer = -1;
    
    function delayRedirect() {
      //clear it if it previously exists
      clearInterval(sessionTimer);
      sessionTimer = setInterval(function() {
        console.log("sessionTimer " + sessionTimer);
      }, 1000);
    }
    <button id="but">Run</button>
        2
  •  1
  •   ChrisG    6 年前

    我觉得所有的答案都只针对Y部分,而不是X部分,因为这显然是一个XY问题。 虽然解决方案是使用一个非函数局部变量,但解决实际问题不需要清除任何内容。只需使用一个间隔来勾选,然后重置计数来延迟重定向:

    var timeleft = 60;
    
    setInterval(function() {
      if (--timeleft === 0) returnToLogin();
      countTimer.innerHTML = timeleft;
    }, 1000);
    
    delay.onclick = function() {
      timeleft = 60;
    }
    
    function returnToLogin() {
      console.log("returning to login");
    }
    <p>Session Timeout In: <span id="countTimer">60</span> seconds....</p>
    <button id="delay">Delay</button>