【问题标题】:clearInterval() not working清除间隔()不工作
【发布时间】:2016-01-09 01:26:10
【问题描述】:

会话长度是定时器的开始时间,默认为25。isEven用于启动/停止定时器,如果isEven为false,定时器应该启动,如果是奇数则应该命中clearInterval,出于某种原因没有停止执行 tick() 函数(它倒计时)。

var count = 0;

function countdown(sessionLength) {
  var minutes = sessionLength - 1;
  var seconds = 60;
  var isEven = false;
  count++;

  if (count % 2 == 0) {
    isEven = true;
  } else {
    isEven = false;
  }

  var myVar = setInterval(tick, 1000);

  if (isEven == false) {
    function tick() {
      if (seconds > 0) {
        seconds--;
      } else {
        minutes--;
        seconds = 59;
      }

      if (minutes > 0) {
        document.getElementById("time").innerHTML =
          minutes.toString() + ":" + (seconds < 10 ? "0" : "") + seconds.toString();
      } else {
        document.getElementById("time").innerHTML =
          "0:" + (seconds < 10 ? "0" : "") + seconds.toString();
      }
    }
  } else {
    console.log("reached");
    clearInterval(myVar);
  }
};

【问题讨论】:

  • 当 setInterval 实际不存在时(因为它在 if 块中),您将 tick 传递给它

标签: javascript timer


【解决方案1】:

tick() 函数声明移到if 块之外

【讨论】:

    【解决方案2】:

    setInterval 变量是本地变量。所以每次调用countdown时它的值都会被覆盖

    。解决方案是在函数 countdown 之外初始化 myVar 或使其成为像这样的全局变量:
    window.myVar =setInterval (tick,1000);

    您还必须将此指令放在第一个 if 块中,以免每次都被覆盖

    var count = 0;  
    function  countdown(sessionLength)  { 
    var minutes = sessionLength - 1; 
    var seconds = 60; 
    var isEven = false; 
    count++; 
    if (count % 2 == 0) { 
        isEven = true; 
    } else { 
        isEven = false;
    } 
    if (isEven == false) { 
        window.myVar = setInterval(tick, 1000);
       function tick() { 
          if (seconds > 0) {  
              seconds--;  
          } else {  
              minutes--; seconds = 59;  
          } 
          if (minutes > 0)  {  
             document.getElementById("time").innerHTML = minutes.toString() + ":" + (seconds < 10 ? "0" : "") + seconds.toString();  
         } else { 
              document.getElementById("time").innerHTML = "0:" + (seconds < 10 ? "0" : "") + seconds.toString(); 
         } 
       } 
    } else { 
         console.log("reached");  
         if (window.myVar){  
              clearInterval(window.myVar); 
              window.myVar = null;
          }
    } 
    };
    

    【讨论】:

    • 感谢您的回复。在最后一个 if 语句 if(window.myVar) 评估什么?如果 myVar 不是布尔类型,它如何执行语句?
    • 在 javascript 中,如果 variablefalse 布尔值、null、未定义或空字符串,则 if (variable) 返回 false。否则,它返回true。我在您的情况下添加了这个,因为此时不需要定义 myVar 或者它可能为 null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多