2011-07-08 37 views
0

我目前有这一点的JavaScript使用jQuery动画来创建水的运动效果。改善JavaScript setInterval代码

var waves = function() { 
    (function() { 
     var FirstWave = function() { 
      this.css = function(p) { 
       var s = Math.sin(p*5) 
       var x = (960 * 2) - (p * 960) + 10 
       var y = s * 5 + 15 
       return {backgroundPosition: "-" + x + "px", bottom: "-" + y + "px"} 
      } 
     }; 

     var tidalWave = function() { 
      $("#waves-1").animate({path: new FirstWave}, 10999, "linear"); 
     }; 

     setInterval(tidalWave, 500); 
    })(); 
}; 

waves()被称为$(document).ready()处理器中。

如您所见,即使动画持续时间短短不到11秒,setInterval也会设置为500。我这样做是为了确保动画在页面加载时开始,因为只需调用$.animate()就不会启动动画。

我确定这样做会有很多速度问题和其他问题。

可以改进吗?

+0

你正在用直接调用的匿名函数表达式包装整个函数体?为什么要这么做? –

+0

'wave()'里面有多个动画 – James

+2

'$(document).ready()'和'setInterval'什么都没有 – davin

回答

0

你应该使用setTimeout而不是setInterval(有很多优点,请看这里:setTimeout or setInterval?),因为你希望它重复你应该在你的tidalWave函数中再次调用tidalWave本身。

var tidalWave = function() { 
    $("#waves-1").animate({path: new FirstWave}, 10999, "linear"); 
    setTimeout(tidalWave, 500); 
}; 

setTimeout(tidalWave, 500); 

现在您还可以使用$(document).ready而不是初始超时。

+0

如果'animate'运行正常,'setTimeout'不能重新调用函数吗? – James

+0

这似乎是一种更干净的做事方式。干杯! – James

+0

如果animate仍在运行,setTimeout可以调用该函数。如果要在动画完成后再次调用该函数,请使用animate为您提供的回调函数。 – ximi