2011-08-22 50 views
4

我在使用jQuery 1.6时遇到了一些动画问题。我用jQuery 1.5解决了它。setInterval()和setTimeout()在现代jQuery动画中做的不好的事情?

在我的项目中,我使用了setInterval()来制作自定义徽标滑块。动画立即(不是同时)两个两个地点燃。一切顺利,当我在网页上,但当我去其他选项卡和复苏(一分钟后,两个左右)到我的网页项目一切都变疯狂了......

好吧,所以我得到了一个答案使用Queue()。我能用这种方法达到同样的效果吗?

我有本书Manning jQuery in Action,并且没有任何关于即刻启动动画的Queue()

Link to Jsfiddle

引述一些答案:

由于requestAnimationFrame()的性质,你永远不应该排队使用的setInterval或setTimeout的循环动画。

+0

我在其中一个页面上发生了类似的事情。我在每个时间间隔开始时用'.stop()'来解决所有活动动画。 – Shad

+0

不同的浏览器处理定时器的方式会有所不同,例如,某些选项可能会暂时中止您的'setInterval';有些可能会排列所有内容,然后尝试赶上当你的标签再次获得焦点 - 听起来像这是发生在你身上的事情。 – nnnnnn

+0

@nnnnnn但与jQuery 1.5没有问题...我取消了UI效果并回到'animate()',但我怀疑这将修复和UI效果。 –

回答

12

一般的setInterval == BADsetTimeout的==为动画GOOD

的setInterval会尽量发挥追赶,因为NNNNNN说:

某些浏览器可能排队一切,然后迎头赶上,当你 标签获取焦点再次

您最好循环播放动画()的方法是递归调用,例如:

var myTimeout; 

var myAnimation = function() { 

    $('#myID').animate({ 
     [propertyKey]:[propertyValue] 
    }, 5000, function() { 
     myTimeout = setTimeOut(myAnimation, 1000); 
    }); 
} 

通知的myTimeout如何举行的myAnnimation范围之外,允许停止动画

clearTimeout(myTimeout); 

,你可以挂接到window.unload事件的能力。

+0

它也与http://bugs.jquery.com/ticket/9381有关。对? –

+0

有点问题#9381与window.unload问题是一样的,但是使用setInterval()只会进一步加剧 - 你应该始终跟踪你的动画。除非你需要一个能够追上来的计时器,否则setInterval仍然是邪恶的。 – martin