嘿,我有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不具备范围。
我有什么选择让我能够清除时间?
答案 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
会使它成为本地的。