jQuery - for循环中队列中的animate + show()

时间:2012-08-28 15:32:22

标签: jquery

我有一个非常具体的问题,我甚至不知道在谷歌寻找什么...... 我正在尝试创建一个动画信。有一个笔和5行在一个单独的标签中,都在一个容器元素内,相对定位,有自己的ID,并且线条被隐藏(所有这些都在它们应该出现的位置)。动画是这样的:笔对角移动,出现一条线,笔移动到新线的开头,重复5次,笔回到默认位置,线条消失。 我不想分别为所有5个周期编写动画代码,所以我使用for循环将动画插入到队列中。一切都很好,除了最愚蠢的事情 - 我无法显示当前的行号。这是代码:

var penAnimating = false;

function animateLetter() {
    var pen = $('#form_decor_pen');
    var startRight = pen.css('right');
    var startTop = pen.css('top');

    if (!penAnimating) {
        penAnimating = true;

        for (var i=1; i<=5; i++) {
            pen.animate( {
                right: '-=26',
                top: '-=10',
            },{ 
                duration: 600,
                queue: 'penAnimation'
            });

这里'问题部分:

pen.queue('penAnimation', function(next) {          
    //var line = $('#form_header_decor :nth-child(' + i.toString() + ')')
    var line = $('#line_' + i.toString())
    line.show();
    //alert(line.id);
    next(); 
})

问题是,我总是输出5 - 循环结束的数字。

            if (i<5) {
                pen.animate({
                    right: '+=26',
                    top: '+=20',
                   },{
                    duration: 300,
                    queue: 'penAnimation'
                });
            } else {
                pen.animate({
                    right: startRight,
                    top: startTop,
                   },{
                    duration: 300,
                    queue: 'penAnimation',
                    complete: function() {
                        penAnimating = false;
                    }
                });
            }​
         }
       pen.dequeue('penAnimation');
    }
}

1 个答案:

答案 0 :(得分:0)

当你有一个包含异步调用的for循环时,for变量的值将是最后一个值。除非你把代码放在一个闭包中。

将for循环更改为for-loop-with-a-closure。

    for (var i=1; i<=5; i++) { 
    (function(i){
    // the second i is now in a closure.
    })(i);
    }