2011-04-20 121 views
2

我试图理解当我把多个调用放在jQuery上时,它意味着什么,因为我没有得到我期望的类似情况下的结果。jQuery函数队列混淆

例1:

$(this).animate({opacity: 0.25}, 250).animate({opacity: 1.0}, 250); 

正如预期的那样,这给了半透明的快闪返回到完全不透明了。

例2:

$(this).animate({opacity: 0.25}, 250).removeAttr("style"); 

在这种情况下,而不是逐渐恢复到不透明,我预计removeAttr(“风格”),以使其跳回不透明度动画完成后。这是因为动画不透明度函数仅仅更改了opacity的值并设置了display:block,我期望通过删除这些样式,一切都恢复正常。

相反,它看起来像removeAttr在动画完成前触发,清除样式,然后动画设置更多的不透明度,使项目保持半透明。

事实上,这是事件发生的顺序似乎的事实,改变removeAttr使用完成回调确认工作正常:

$(this).animate({opacity: 0.25}, 250, function(){$(this).removeAttr("style");}); 

为什么是它的动画似乎要处理串行,而至少有一些功能与动画并行处理?

回答

3

这里有两种不同的队列。

当您拨打animate时,会将其推送到名为fx的效果队列中。大多数其他事情不使用队列。这就是为什么这两个电话似乎同时发生。

+1

+1,但大多数其他函数(如removeAttr())甚至不使用队列,而是立即应用它们的效果。 – 2011-04-20 00:29:06

+0

@ Box9:我只是想编辑我的答案:),在与jsFiddle玩了一段时间之后:http://jsfiddle.net/QVXEC/ – 2011-04-20 00:31:24

+0

通过在调用'animate'时将'queue'更改为'false' ,它应该立即执行而不等待'fx'队列上的其他功能。它的确如此,但它并不完全同步执行,因为人们会相信,因为'removeAttr'也会立即触发。 – 2011-04-20 00:32:49

2

您可以将animate视为异步。

如果你想在之后发生动画完成,那么你应该使用回调函数。