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

Dav*_* V. 26 jquery jquery-animate

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

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

$(".myclass").fadeOut(slow,mycallback);
Run Code Online (Sandbox Code Playgroud)

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

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

<!DOCTYPE html>
<html>
<head>
  <title>Example</title>
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script>
  <script type="text/javascript">
    $(document).ready(function() {
      var $mc=$(".myclass"),l=$mc.length;
      $mc.fadeOut("slow",function(){
        if (! --l) $("#target").append("<p>All done.</p>");
      });
    });
  </script>
  <style type="text/css">
  </style>
</head>
<body>
  <p class="myclass">Paragraph</p>
  <p class="myclass">Paragraph</p>
  <p class="myclass">Paragraph</p>
  <p class="myclass">Paragraph</p>
  <p class="myclass">Paragraph</p>
  <p class="myclass">Paragraph</p>
  <div id="target"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

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

Scr*_*rat 46

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

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

  • 好决定。类似地,它使用队列在完成最后一个元素的设置后触发回调:elements.fadeOut(330).last()。queue(function(){}); (2认同)

Nic*_*ver 29

您可以为所有这些回调运行相同的回调,但只有if当前没有动画再次执行时才执行该子句,如下所示:

  $(".myclass").fadeOut("slow", function() {
    if ($(".myclass:animated").length === 0)
      $("#target").append("<p>All done.</p>");
  });
Run Code Online (Sandbox Code Playgroud)

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

$(".myclass:animated, .myClass2:animated")
Run Code Online (Sandbox Code Playgroud)

如果你在很多地方使用它,我会把这个回调作为一个onFinish功能或其他东西来整理它.

  • 尼克:其他动画不是问题。在我的测试中,该元素在调用其自己的回调时仍与*:animated相匹配。因此,长度永远不会为0。 (2认同)