当我清除div时,不能停止我的超时

时间:2013-07-14 04:51:52

标签: javascript

嘿,我有setTimeOut();

一遍又一遍地呼唤自己。

问题是我想在用户关闭给定div时清除它,但是我不知道如何使用clearTimeout()通过使用正在运行的超时的id来中止它。

以下是我职能的一个例子:

upgrade(end , new Date().getTime() / 1000 ,text,false);
//happens when you clicks on something

function upgrade(end, start, text, timerId){        

    var per = ( (new Date().getTime() / 1000) - start ) / ( end - start ) * 100;

    if(per>100)per=100;
    if(per<0)per = 0;
    text.innerHTML = Math.round(per)+'%';
timerId = setTimeout(function() { upgrade_bar(end, start, text, timerId) } , 17);
}

现在假设用户想要关闭此计时器。当id的范围仅限于函数时,如何clearTimeout(timerId)

我有这样的例子:

document.getElementById("sbmt").addEventListener("click", remove_div, false);
//this happens during windows.onload

不知何故,我的函数remove_div必须清除它。但超时的id不具备范围。

我有什么选择让我能够清除时间?

3 个答案:

答案 0 :(得分:1)

您需要访问setTimeout返回的id,因为您指出它无法按照您编写的方式访问,但将其移出是一件简单的事情。

例如:

var timeout;
function start() {
    timeout = window.setTimeout(function() {
        start();
    }, 200);
}

function stop() {
    window.clearTimeout(timeout);
}

答案 1 :(得分:1)

有几种方法可以做到这一点。

首先,您可以从timerId返回upgrade。您将该值存储在可由其他函数访问的变量中。

或者,您可以在父对象(在您的情况下,看起来像window)中创建一个存储id的变量。

例如:

function upgrade(end, start, text, timerId) {
    // do stuff
    return setTimeout(/*params*/);
}
var timerId = upgrade(/*params*/);

function remove_div(event) {
    // do stuff
    clearTimeout(this.timerId);
}

document.getElementById("sbmt").addEventListener("click", remove_div.bind({'timerId': timerId, 'element': document.getElementById("sbmt")}, false);

或者:

var timerId;
function upgrade(end, start, text) {
    // do stuff
    timerId = setTimeout(/*params*/);
}

function remove_div(event) { 
    // do stuff
    clearTimeout(timerId);
}

document.getElementById("sbmt").addEventListener("click", remove_div, false);

答案 2 :(得分:0)

您可以将超时ID挂钩到窗口范围,如此。

 window['timerId'] = setTimeout(function() { upgrade_bar(end, start, text, timerId) } , 17);

timerId替换为window['timerId']window.timerId,以便明确将其挂钩到全局范围。

并清除它

 clearTimeout(window['timerId']);

 window.clearTimeout(window.timerId);

btw timerId不是本地变量。这个var timerId会使它成为本地的。

相关问题