为什么函数之间的setTimeout不起作用?

时间:2012-04-26 16:42:40

标签: javascript jquery animation raphael settimeout

我有一系列raphael动画,我想以特定的顺序发射。

  1. 淡入曲线。
  2. 淡入球。
  3. 沿着曲线设置球的动画。
  4. 我在每个函数之间都有一个setTimeout,但动画只是同时触发。

    View it on JSFiddle或此处:

    Raphael("bounce", 640, 480, function () {
            var r = this,
                p =                 r.path("M0,77.255c0,0,269.393,37.431,412.96,247.653 c0,0,95.883-149.719,226.632-153.309").attr({stroke: "#666", opacity: .0, "stroke-width": 1}),
                len = p.getTotalLength(),
            e = r.circle(0, 0, 7).attr({stroke: "none", fill: "#000", opacity:0}).onAnimation(function () {
                    var t = this.attr("transform");
                });
            r.customAttributes.along = function (v) {
                var point = p.getPointAtLength(v * len);
                return {
                    transform: "t" + [point.x, point.y] + "r" + point.alpha
                };
            };
            e.attr({along: 0});
    
            var rotateAlongThePath = true;
            function fadecurve(ca,ba,aa,ab){
                ca.animate({opacity:1},2000);
                setTimeout(fadeball(ba,aa,ab),6000);
            }
            function fadeball(ba,aa,ab) {
                   ba.animate({opacity:1},400);
                   setTimeout(run(ba, aa,ab),5000);
            }
            function run(ba,aa,ab) {
                   ba.animate({opacity:1},400);
                   ba.animate({along: aa}, ab, ">", function () {
                    ba.attr({along: aa});
                });
            }
            fadecurve(p,e,.9,500);
    });   
    

5 个答案:

答案 0 :(得分:2)

使用匿名函数,例如:

setTimeout(function(){
  fadeball(ba,aa,ab);
},6000);

使用setTimeout(fadeball(ba,aa,ab),6000);函数fadeball会因()而被立即调用,这就是问题所在。

确保以这种方式调用run函数:)

答案 1 :(得分:2)

问题出在你的setTimeout

中的函数引用中
setTimeout(fadeball(ba,aa,ab),6000);

你在这里做的是执行该函数,然后将结果指定为你的setTimeout的第一个参数,如果你使用匿名函数就可以了。

setTimeout(function(){
  fadeball(ba,aa,ab);
},6000);

答案 2 :(得分:1)

您正在立即调用您的函数,然后将该函数的结果传递给setTimeout。您需要将函数传递给setTimeout

setTimeout(function(){
    fadeball(ba,aa,ab);
},6000);

答案 3 :(得分:1)

如果这是偏离主题的话我很抱歉,但你这样做的方式是不可扩展的。虽然设置这样的重复超时适用于一些功能,但随着步骤数量的增加,多步动画变得越来越麻烦。 jQuery可以对动画进行排序,但jQuery的内置动画队列通常不提供所需的功能(如瀑布属性)。这是一个更简洁,功能强大且可扩展的替代方案Frame.js

  var ca = p, ba = e, aa = .9, ab = 500;
  Frame(500, function(next){
      ca.animate({opacity:1}, 2000, next);
  });
  Frame(4000, function(next){
      ba.animate({opacity:1}, 400, next);
  });
  Frame(5000, function(next){
      ba.animate({opacity:1}, 400);
      ba.animate({along: aa}, ab, ">", next);
  });
  Frame(function(next){
      ba.attr({ along: aa });
      next();
  });
  Frame.init();

答案 4 :(得分:0)

JQuery的animate函数有一个动画完整的回调,所以你可以连续发射动画:

function SecondAnimation() { $('element').animate(....., ThirdAnimation); }
function ThirdAnimation() { $('element').animate(....., FourthAnimation); }
function FourthAnimation() { $('element').animate(.....); }


$('element').animate(....., SecondAnimation);