0

我知道这里还有其他一些帖子有类似的问题,但没有一个能帮助我......

我需要按顺序执行一些函数(它们是异步的)来为 svg 元素设置动画,一个在前一个结束之后,但在一个循环内。这是我的代码:

    function begin (i,time){
        setTimeout(function(){
            $('.pie-chart animate')[i].beginElement();
        },time);
    }

    for(var i=0;i<$('.pie-chart animate').length;i++){
        dur = $('.pie-chart animate').eq(i).attr('dur');
        time = parseInt(dur.substr(0,1));
        time = time * 1000;
        begin(i,time);
    }

此后,所有动画同时执行。谁能帮帮我,谢谢^^。

4

2 回答 2

1

'按顺序,我认为你的意思是同步的,而(不是 AJAX)我认为你的意思不是异步的。要正确执行此操作(异步),您应该使用回调。像这样的东西:

function begin (i){
    if (i >= $('.pie-chart animate').length) return;//you're done
    dur = $('.pie-chart animate').eq(i).attr('dur');
    time = parseInt(dur.substr(0,1));
    time = time * 1000;

    setTimeout(function(){
        $('.pie-chart animate')[i].beginElement();
        begin(i+1);    
    },time);
}

 begin(0);
于 2013-01-31T16:41:15.923 回答
0

看起来你的时间在循环中被重置了,所以如果你的所有动画都有9秒,那么所有动画都会在 9 秒后开始。

在循环中,您需要从当前之前的所有迭代元素的持续时间总和执行开始。看例子:

function begin (i,time){
    setTimeout(function(){
        $('.pie-chart animate')[i].beginElement();
    },time);
}

var time = 0;
for(var i=0;i<$('.pie-chart animate').length;i++){
    dur = $('.pie-chart animate').eq(i).attr('dur');
    time += parseInt(dur, 10) * 1000;
    begin(i, (i===0)?0:time);
}
于 2013-01-31T16:43:12.907 回答