Javascript setTimeout не останавливается на clearInterval()
Как остановить таймер, если clearInterval () его не останавливает?
Цель этого кода состоит в том, чтобы анимировать число от 0 вверх, пока оно не достигнет конца (например, анимировать от 0... 75%). Но таймер не останавливается, когда я вызываю clearInterval ():
<div id="foo"></div>
<div id="bar"></div>
animate("99%", $("#foo")); // doesnt stop
animate("75%", $("#bar")); // doesnt stop
function loop(clr, clr2, ele, rand, last, delay) {
clearInterval(clr);
clearInterval(clr2);
inloop(clr, clr2, ele, rand, last, delay);
if (rand >= last) {
clearInterval(clr);
clearInterval(clr2);
}
else {
clr2 = setTimeout(function () {
loop(clr, clr2, ele, rand, last, delay);
}, 2500);
}
}
function inloop(clr, clr2, ele, rand, last, delay) {
ele.html((rand += 1) + "%");
if (rand >= last) {
clearInterval(clr);
clearInterval(clr2);
}
else {
clr = setTimeout(function () {
inloop(clr, clr2, ele, rand, last, delay);
}, delay);
}
}
function animate(end, display) {
var clr = null;
var clr2 = null;
var ele = null;
var rand = 0; // initial number
var last = 99; // last number
var delay = 5; // inner loop delay
ele = display;
ele.html("0%");
var idx = end.indexOf("%");
if (idx >=0) {
end = end.substring(0,idx);
}
last = parseInt(end);
loop(clr, clr2, ele, rand, last, delay);
}
1 ответ:
Вы используете
clearTimeout()
сsetTimeout()
.Вы не используете
clearInterval()
сsetTimeout()
.clearInterval()
идет сsetInterval()
.У вас также есть структурная проблема в вашем коде. Вы передаете clr и clr2 в качестве аргументов и ожидаете, что исходные значения этих параметров будут изменены, но это не так.
Вы можете исправить это, поместив их обоих в объект и передав объект следующим образом:
animate("99%", $("#foo")); //animate("75%", $("#bar")); function loop(timers, ele, rand, last, delay) { clearTimeout(timers.clr); clearTimeout(timers.clr2); inloop(timers, ele, rand, last, delay); if (rand >= last) { clearTimeout(timers.clr); clearTimeout(timers.clr2); } else { timers.clr2 = setTimeout(function () { loop(timers, ele, rand, last, delay); }, 2500); } } function inloop(timers, ele, rand, last, delay) { ele.html((rand += 1) + "%"); if (rand >= last) { clearTimeout(timers.clr); clearTimeout(timers.clr2); } else { timers.clr = setTimeout(function () { inloop(timers, ele, rand, last, delay); }, delay); } } function animate(end, display) { var timers = {clr: null, clr2: null}; var ele = null; var rand = 0; // initial number var last = 99; // last number var delay = 5; // inner loop delay ele = display; ele.html("0%"); var idx = end.indexOf("%"); if (idx >=0) { end = end.substring(0,idx); } last = parseInt(end); loop(timers, ele, rand, last, delay); }
Рабочий jsFiddle: http://jsfiddle.net/jfriend00/PEqeY/