Jquery – 延迟回调,直到完成多个动画
在多个元素完成动画制作后,我需要一个回调来执行一次。 我的jquery选择器如下:
$('.buttons').fadeIn('fast',function() { // my callback });
这个问题是按钮类匹配了许多元素,所有这些元素都需要在执行回调之前淡入。 就目前而言,回调是在每个元素完成动画后执行的。 这不是所需的function。 我正在寻找一个优雅的解决方案,这样我的回调只在所有匹配的元素完成动画后执行一次。 这个问题已经出现在包括SO在内的一些地方,但是从来没有一个优雅的答案(甚至也没有一个明确的答案 – 对一个人有用的解决方案对其他人来说根本不起作用)。
替换@ Ross的答案总会触发最后一个按钮淡入的回调(可能是也可能不是被告知动画的最后一个按钮)可能是:
var buttons = $(".buttons"); var numbuttons = buttons.length; var i = 0; buttons.fadeIn('fast', function() { i++; if(i == numbuttons) { //do your callback stuff } });
jQuery在版本1.6中引入了一个承诺 ,并且比添加计数器更优雅。
例:
// Step 1: Make your animation $(".buttons").each(function() { $(this).fadeIn("fast"); }); // Step 2: Attach a promise to be called once animation is complete $(".buttons").promise().done(function() { // my callback });
要将不相关的元素动画收集到单个回调中,您可以执行以下操作:
$.when( $someElement.animate(...).promise(), $someOtherElement.animate(...).promise() ).done(function() { console.log("Both animations complete"); });
var $buttons = $('.buttons'); $buttons.each( function (index) { if ( index == $buttons.length - 1 ) { $(this).fadeIn('fast',function() { // my callback }); } else { $(this).fadeIn('fast'); } });
未经测试但这应该仅将回调应用于最后一个按钮。
我的解决方案背后的想法是保持一个柜台。 每当动画结束时,您只需递增此计数器,就可以看到最后一个按钮的时间。 记住在完成所有操作后将计数器设置回零,因为您可能想要重复此操作(再次隐藏它们并再次显示它们)。
var $buttons=$('.buttons'), button_n=$buttons.length, button_counter=0; $buttons.fadeIn('fast', function () { if (button_counter==button_n-1) { alert('It is all done!'); button_counter=0; } else { button_counter++; } });
onClickBtnEdit = function(){ var $EditDel = $($btnEdit).add($btnDel); var btns = $EditDel.size(); $EditDel.fadeOut("def",function(){ btns--; if(btns===0){ $($btnSave).add($btnCancel).fadeIn("slow"); } }); };