情况
我有一个函数,单击按钮即可调用该函数,该函数应绘制一个动画图表,并每2秒更新一次图表。当用户再次单击该按钮时,动画仍在运行,动画应停止。
我当前的解决方案
现在,我具有以下脚本,该脚本可以直观地停止动画,但是底层的for循环一直持续到后台结束:
var animRun = false;
$("#animateButton").on("click", function() {
if (animRun === false) {
redraw(data.slice(0,30))
//some CSS...
} else {
//Some CSS...
animRun = false;
}
});
function redraw(data) {
animRun = true;
for (var i=0; i<data.length;i++){
(function(i){
setTimeout(function(){
if(animRun === true) {
//draw the chart
return draw(data[i])
}
},2000*(i))
if (i === data.length -1) {
//reset animRun
if(animRun === true) {
//Some CSS things
//...
animRun = false;
}
}
})(i);
}
}
问题
在动画仍在执行时用户再次单击按钮时,停止for循环的正确方法是什么?
答案 0 :(得分:1)
您尝试过clearTimeout
。将绘制超时存储到数组中,并在完成后停止
var animRun = false;
var drawArr = [];
$("#animateButton").on("click", function() {
if (animRun === false) {
redraw(data.slice(0,30))
//some CSS...
} else {
//Some CSS...
animRun = false;
drawArr.forEach(d=>clearTimeout(d));
}
});
function redraw(data) {
animRun = true;
for (var i=0; i<data.length;i++){
(function(i){
drawArr[i] = setTimeout(function(){
if(animRun === true) {
//draw the chart
return draw(data[i])
}
},2000*(i))
if (i === data.length -1) {
//reset animRun
if(animRun === true) {
//Some CSS things
//...
animRun = false;
}
}
})(i);
}
}