【问题标题】:timer doesn't stop on buttonclick计时器不会在按钮单击时停止
【发布时间】:2013-02-23 15:27:44
【问题描述】:

我在单击按钮时遇到计时器问题。当我单击按钮 startpause() 方法被调用时,我设置了启动计时器和停止计时器。当我正常单击按钮时它工作正常(一次单击后再次单击)但是当我一次又一次地快速单击按钮时,计时器开始以 2-3 秒的速度跳动。似乎不止一个计时器正在运行..任何人有任何想法....??这里时间是我的计时器方法

function startpause() {

    if(FLAG_CLICK) {
        setTimeout(tim,1000);               
        FLAG_CLICK = false;
    }
    else {
        clearTimeout(ti);
        FLAG_CLICK = true;
    }
}

function tim() { 

    time.innerHTML = t;
    t = t + 1;      
    ti= setTimeout("tim()", 1000);
}

【问题讨论】:

    标签: javascript html


    【解决方案1】:

    试试这个:

    // assuming you declared ti and t out here, cuz I hope they're not global
    
    var t = 0;
    var ti;    
    var running = false;
    
    function startpause() {
    
        clearTimeout(ti);
        if(!running) {
            ti = setTimeout(tim,1000); 
            running = true;
        } else {
            running = false;
        }
    }
    function tim() { 
        time.innerHTML = t;
        t = t + 1; 
        ti = setTimeout(tim,1000); 
    }
    

    您可以在此处阅读有关.setTimeout() 的更多信息:https://developer.mozilla.org/en/docs/DOM/window.setTimeout

    另外,请看我刚刚创建的 jsfiddle:http://jsfiddle.net/4BMhd/

    【讨论】:

    • yuhooo 这个概念奏效了。您提供的代码不起作用。它仅适用于计时器的每次开始点击。但我添加到 ti = setTimeout('tim()', 1000);在有效的 tim() 方法中.. 非常感谢你的想法:-)
    • 对不起,我在修补它。但有一件事是,我建议不要将字符串 'tim()' 传递给 setTimeout(),因为它会强制函数调用 eval() 函数来解释该字符串并将其作为 JavaScript 执行。如您所知或可能不知道,eval 是邪恶的! (stackoverflow.com/questions/86513/…)
    【解决方案2】:

    您需要将 setTimeout 存储在某个地方以便以后对其进行操作。

    var myVar;
    
    function myFunction()
    {
      myVar=setTimeout(function(){alert("Hello")},3000);
    }
    
    function myStopFunction()
    {
      clearTimeout(myVar);
    }
    

    参考http://www.w3schools.com/js/js_timing.asp

    【讨论】:

      【解决方案3】:

      也许你必须改变这个:

      if(FLAG_CLICK) {
          setTimeout(tim,1000);               
          FLAG_CLICK = false;
      }
      

      到:

      if(FLAG_CLICK) {
          tim();               
          FLAG_CLICK = false;
      }
      

      这对我来说似乎正常

      【讨论】:

        猜你喜欢
        • 2021-03-26
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-25
        相关资源
        最近更新 更多