Javascript jquery.animate()在循环中使用完成时的索引:

Javascript jquery.animate()在循环中使用完成时的索引:,javascript,jquery,Javascript,Jquery,我正在编写一个脚本,该脚本一次运行多个动画,并且基于新动画开始的时间,当前正在制作动画的其余元素必须.stop()并移动到另一个动画(这正在工作)。因此,我构建了一个动画数组,当添加一个新动画时,该数组将得到.animate(),当每个动画完成时,我需要将其从数组中删除。以下是我尝试使用的代码: for (var i = 0; i < animations[key].length; i++) { animations[key][i].object.animate({ top: an

我正在编写一个脚本,该脚本一次运行多个动画,并且基于新动画开始的时间,当前正在制作动画的其余元素必须.stop()并移动到另一个动画(这正在工作)。因此,我构建了一个动画数组,当添加一个新动画时,该数组将得到.animate(),当每个动画完成时,我需要将其从数组中删除。以下是我尝试使用的代码:

for (var i = 0; i < animations[key].length; i++) {
animations[key][i].object.animate({
    top: animations[key][i].endCoords.top,
    left: animations[key][i].endCoords.left
}, {
    duration: 800,
    complete: function() {
        console.log(i);
        animations[key].splice(i, 1);
        console.log(animations);
    }
});
}
for(var i=0;i
问题是:运行时,
i
设置为动画[key].length。我很确定我理解它为什么这样做,因为for循环在动画完成之前继续(这很好,因为它允许我一次运行多个动画),但是有没有办法编写代码,以便在完成时:runs有正确的索引来执行拼接


提前谢谢

为每次迭代使用/分配不同的变量应该做到:

for (var i = animations[key].length-1; i >= 0; i--) {
    var id = i;
    animations[key][id].object.animate({
        top: animations[key][id].endCoords.top,
        left: animations[key][id].endCoords.left
    }, {
        duration: 800,
        complete: function() {
            console.log(id);
            animations[key].splice(id, 1);
            console.log(animations);
        }
    });
}
否则每次都会调用
animations[key].splice(animations[key].length,1)
(因为循环在任何动画完成之前执行)

即使如此,您可能需要重新考虑您的方法:除非动画以完全相同的顺序完成,否则您可能仍然会遇到问题


编辑:反转循环方向(请参见下面的注释)-这会产生以相反顺序启动动画的副作用

当数组中只有一个项目时,此解决方案有效,但当发生多个相同问题时,它们最终都具有相同的值。你会建议我做什么来“重新考虑我的方法”?哦-天哪!如果动画按顺序结束,我将调用splice(0,1)-它将所有元素向下移动一个索引-然后splice(1,1)-它实际删除最初有索引2的元素-然后splice(3,1)-它删除原始元素5-依此类推。。。迭代应该转到另一边(从.length向下)。很抱歉没有及早发现这一点作为“方法”的事情,我真的不知道你打算推荐什么。。。除非你真的需要动画[KIM]保持动画直到动画完成,你可以先从队列中弹出动画然后运行它们-否则你可以考虑使用不同的数据结构来进行动画的阿纳尔数组。(链表可以在不破坏索引的情况下删除元素-地图/字典可能更容易处理)…这取决于你需要做什么(除了启动动画),我想我会尝试这些选项。谢谢你的输入!