Javascript Can';当我清除div时,我不能停止超时

Javascript Can';当我清除div时,我不能停止超时,javascript,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){

嘿,我有一个
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);
}
不知何故,我的函数
remove\u div
必须清除它。但是超时的id没有范围


这里有哪些选项允许我清除超时?

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

例如:

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

function stop() {
    window.clearTimeout(timeout);
}
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);

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

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

或者,您可以在父对象内创建一个变量(在您的情况下,它看起来像是存储id的
窗口

例如:

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

function stop() {
    window.clearTimeout(timeout);
}
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);
或:


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

 window['timerId'] = setTimeout(function() { upgrade_bar(end, start, text, timerId) } , 17);
timerId
替换为
window['timerId']
window.timerId
,以便将其显式挂接到全局范围

然后像这样清除它

 clearTimeout(window['timerId']);


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

我认为最好将其存储为一个函数或另一个函数的属性(例如,
start.timeout=window.setTimeout(…)
window.cleartimout(start.timeout)
)。这仍然可以防止重新进入,但至少不会污染全局命名空间@ruakh我不反对,污染全局是个坏主意,通常如果我有这样的东西,我会将它封装在一个函数中,并带有start-stop属性,这样范围就局限于该函数,但我认为这是对提出的问题更直接的回答。如果我想创建多个计时器,那么您的第一个示例似乎是最好的,但是,如果我返回setTimeout,它是否会继续运行该函数?正如您在我的示例中所看到的,超时调用的函数与它所在的函数相同,因此在某些方面类似于setInterval。返回
setTimeout
不会返回该函数。相反,它返回的是
setTimeout
返回的内容(我认为是id)。我认为这是可行的,但是您引用window.timerId的方式不一致有什么原因吗?为什么在前两行将其称为数组,然后在第三行将其称为属性?如果将多个超时指定给window,这将如何工作?我想它不会覆盖
timerId
只是语法变化,使用数组变量(即名称中的空格)将有更多的自由度,因此可以使用更独特的名称。但是它们都是相同的。@Dave当您调用函数clearTimeout时,实际上是覆盖了保存setTimeout函数的变量。所以不。嗯,可伸缩性不是很强,那么@jayharris:(你能告诉我们,当单击某个对象时,升级函数是如何被调用的吗?你是想取消所有超时,还是只取消特定的超时?当单击对象时,它调用一个函数…在该函数中,它调用我的
upgrade()
函数,如问题所示(示例代码的第一行是如何开始超时)但是什么对象,它与
sbmt
有什么关系,以及如何知道要取消的超时,或者应该取消所有超时?而且,
timerId
是全局的,所以可以在任何地方访问?只有在我忘记放入
var
的函数中才没有timerId,但它不是每次都在不断地创建一个新的想法,这是问题
 window.clearTimeout(window.timerId);