0

嘿,我有一个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);
}

现在假设用户想要关闭这个计时器。clearTimeout(timerId)当 id 的范围仅限于函数时,我该怎么办?

我有例如这个:

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

不知何故,我的功能remove_div必须清除它。但是超时的 id 没有范围。

我有什么选择可以让我清除超时?

4

3 回答 3

1

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

首先,您可以返回timerIdfrom 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);
于 2013-07-14T05:04:39.487 回答
1

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

例如:

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

function stop() {
    window.clearTimeout(timeout);
}
于 2013-07-14T05:02:28.193 回答
0

您可以像这样将超时 id 挂接到窗口范围。

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

替换timerIdwindow['timerId']or window.timerId,您可以将其显式挂钩到全局范围。

像这样清除它

 clearTimeout(window['timerId']);

或者

 window.clearTimeout(window.timerId);

顺便说一句timerId,它不是局部变量。这var timerId将使它成为本地的。

于 2013-07-14T05:05:11.030 回答