jQuery,在多个动画之后只调用一次回调

假设我有几个动画同时运行,我想在完成所有这些动作后调用它。

只有一个动画,很容易; 有一个回调。 例如 :

$(".myclass").fadeOut(slow,mycallback); 

麻烦的是,如果我的选择器找到了几个项目,那么将为每个项目调用回调。

解决方法并不太难; 例如 :

    Example   $(document).ready(function() { var $mc=$(".myclass"),l=$mc.length; $mc.fadeOut("slow",function(){ if (! --l) $("#target").append("

All done.

"); }); });

Paragraph

Paragraph

Paragraph

Paragraph

Paragraph

Paragraph

我的问题是:有更好的方法吗?

您可以为所有这些回调运行相同的回调,但是如果当前没有动画,则只执行if子句,如下所示:

  $(".myclass").fadeOut("slow", function() { if ($(".myclass:animated").length === 0) $("#target").append("

All done.

"); });

这只是通过:animated选择器检查是否还有:animated 。 如果你动画很多不同的东西然后使用相同的概念,只需添加到选择器,如下所示:

 $(".myclass:animated, .myClass2:animated") 

如果你在很多地方使用它,我会把这个回调变成onFinish函数或者整理它的东西。

看一下这个post的讨论: jQuery $ .animate()多个元素但只有一次fire callback

.when()/.then().promise().done(callback()); 函数为在所有动画结束时调用单个calllback的问题提供了更优雅的解决方案。

在我的情况下,我必须定义

 if ($(".myclass:animated").length === 1)