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);