Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在jQuery中检测多个元素上同时完成多个动画?_Jquery - Fatal编程技术网

如何在jQuery中检测多个元素上同时完成多个动画?

如何在jQuery中检测多个元素上同时完成多个动画?,jquery,Jquery,我有一个相当复杂的设置,有两列元素。 单击一个元素会在其下打开“详细信息”部分,关闭此列中以前打开的任何其他详细信息部分,过滤其他列表,并在其他列的其余元素下打开“详细信息”部分 这对用户来说是相当沉重的,所以我尝试将所有这些动画化,并将其分为许多步骤或波,以便用户能够理解正在发生的事情 第1波:同时 关闭“所有元素”下的“详细信息”部分 淡入隐藏的元素 第二波:同时 打开单击的元素的详细信息部分 淡出另一列中的某些元素 第三波:同时 在另一列的其余元素下打开详细信息部分 我通常使用

我有一个相当复杂的设置,有两列元素。 单击一个元素会在其下打开“详细信息”部分,关闭此列中以前打开的任何其他详细信息部分,过滤其他列表,并在其他列的其余元素下打开“详细信息”部分

这对用户来说是相当沉重的,所以我尝试将所有这些动画化,并将其分为许多步骤或波,以便用户能够理解正在发生的事情

第1波:同时

  • 关闭“所有元素”下的“详细信息”部分
  • 淡入隐藏的元素
第二波:同时

  • 打开单击的元素的详细信息部分
  • 淡出另一列中的某些元素
第三波:同时

  • 在另一列的其余元素下打开详细信息部分
我通常使用
animate
方法的回调函数在第一个动画完成时启动第二个动画,但由于我正在等待多个动画完成,这种方法不起作用。此外,这些动画会影响许多元素,因此使用
queue:false
并不完全符合要求


如何检测多个元素上同时完成的多个动画?

使用setInterval查询相关元素,查看
:animated
是否为真。

使用setInterval查询相关元素,查看
:animated
是否为真。

使用jQuery的“何时”和“完成”方法。它们可用于聚合多个“差异化”对象,如设置返回动画的对象。 例如:

$.when(
   $('#A').animate({height : 100}), 
   $('#B').animate({width : 50})
).done(function() { alert('All Done!') })
使用jQuery的“when”和“done”方法。它们可用于聚合多个“差异化”对象,如设置返回动画的对象。 例如:

$.when(
   $('#A').animate({height : 100}), 
   $('#B').animate({width : 50})
).done(function() { alert('All Done!') })

使用初始化为0的全局计数器。当动画开始时,将其递增。当动画完成时,将其减量,如果它返回到0,则运行主处理程序,该处理程序应在所有动画完成时执行。

使用初始化为0的全局计数器。当动画开始时,将其递增。当一个动画完成时,将其减量,如果它返回到0,则运行所有动画完成时应执行的主处理程序。

对于正在启动的每个动画,创建一个jQuery延迟对象:

var animDf1 = jQuery.Deferred();
var animDf2 = jQuery.Deferred();
...
var animDf1 = $('#thing1').fadeOut(500);
var animDf2 = $('#thing2').fadeOut(500);

$.when(animDf1, animDf2).then(function() {
    // animations are done... what's next?
});
在动画中的回调中,解析该回调:

$('#thing1').fadeOut(500, function() {
    var animDf1.resolve();
});
将每组延迟对象与“when”函数组合:

// Wave 1:
$.when(animDf1, animDf2, animDf3, ...).then(function() {
    // They are all done.  Time for the next thing
    Wave2Start();
});
请记住,延迟的问题只能解决(或拒绝)一次。如果所有这些动画都重复,您将需要创建新的jQuery.Deferred对象,以便下次处理

更新:正如idanzalz在评论中提到的,您可能不需要创建单独的延迟对象,因为您可以使用动画函数本身的返回作为延迟对象:

var animDf1 = jQuery.Deferred();
var animDf2 = jQuery.Deferred();
...
var animDf1 = $('#thing1').fadeOut(500);
var animDf2 = $('#thing2').fadeOut(500);

$.when(animDf1, animDf2).then(function() {
    // animations are done... what's next?
});

是否可以使用此方法取决于代码结构,以及是否将多个动画应用于同一对象。我上面的第一个建议允许您显式控制每个.resolve()

var animDf1 = jQuery.Deferred();
var animDf2 = jQuery.Deferred();
...
var animDf1 = $('#thing1').fadeOut(500);
var animDf2 = $('#thing2').fadeOut(500);

$.when(animDf1, animDf2).then(function() {
    // animations are done... what's next?
});
在动画中的回调中,解析该回调:

$('#thing1').fadeOut(500, function() {
    var animDf1.resolve();
});
将每组延迟对象与“when”函数组合:

// Wave 1:
$.when(animDf1, animDf2, animDf3, ...).then(function() {
    // They are all done.  Time for the next thing
    Wave2Start();
});
请记住,延迟的问题只能解决(或拒绝)一次。如果所有这些动画都重复,您将需要创建新的jQuery.Deferred对象,以便下次处理

更新:正如idanzalz在评论中提到的,您可能不需要创建单独的延迟对象,因为您可以使用动画函数本身的返回作为延迟对象:

var animDf1 = jQuery.Deferred();
var animDf2 = jQuery.Deferred();
...
var animDf1 = $('#thing1').fadeOut(500);
var animDf2 = $('#thing2').fadeOut(500);

$.when(animDf1, animDf2).then(function() {
    // animations are done... what's next?
});

是否可以使用此方法取决于代码结构,以及是否将多个动画应用于同一对象。我上面的第一个建议让您可以显式地控制每个.resolve()。

为什么不使用animate调用的结果作为延迟对象?我想知道您的意思是什么?效果函数(例如淡出)返回jQuery对象,而不是延迟对象。如果在对象(jQuery.Deferred除外)上使用$.when(),它将立即被解析。(或者我错了吗?)jquery对象不是延迟对象,但它仍然有“promise”方法,这正是我们在这里需要的。承诺的默认上下文是“fx”上下文,这意味着当对象上的所有动画都已解析时,它将被解析。有关更多信息,请参阅感谢idanzalz。好消息。我已经用你建议的更简洁的方法更新了我的答案(除了我最初编写的冗长但更明确的方法)。为什么不使用动画调用的结果作为延迟对象呢?我想知道你的意思是什么?效果函数(例如淡出)返回jQuery对象,而不是延迟对象。如果在对象(jQuery.Deferred除外)上使用$.when(),它将立即被解析。(或者我错了吗?)jquery对象不是延迟对象,但它仍然有“promise”方法,这正是我们在这里需要的。承诺的默认上下文是“fx”上下文,这意味着当对象上的所有动画都已解析时,它将被解析。有关更多信息,请参阅感谢idanzalz。好消息。我已经用你建议的更简洁的方法更新了我的答案(除了我最初编写的冗长但更明确的方法)。如果某些动画在另一个开始之前完成,则可能存在竞争条件。在这种情况下,如果从开始时就知道动画的数量,则计数器可以初始化为该数量,然后仅递减。如果动画数量未知,并且在最后一个动画完成之前计数器可能达到0,则此算法仍应可用,但需要进行修改以匹配特定问题。如果某些动画完成,则可能存在竞争条件