2011-03-07 19 views
22

Birden çok öğenin animasyon işlemini bitirdikten sonra bir kez daha yürütmek üzere bir geri aramaya ihtiyacım var. şöyle Benim jquery seçicidir: bununlaJQuery - birden fazla animasyon tamamlanana kadar geri arama erteleme

$('.buttons').fadeIn('fast',function() { 
    // my callback 
}); 

sorun düğmeleri sınıf geri arama çalıştırılmadan önce de soluk gereken tüm bunların unsurları, bir dizi ile eşleşen olmasıdır. Şu anda olduğu gibi, her bir elemanın animasyonunu bitirdikten sonra geri arama gerçekleştirilir. Bu istenen fonksiyon DEĞİLDİR. Geri arama işlemimin sadece eşleşen öğeler tamamlandıktan sonra bir kez yürütüldüğü şekilde zarif bir çözüm arıyorum. Bu soru SO da dahil olmak üzere birkaç noktada ortaya çıktı, ama hiçbir zaman zarif bir cevap olmadı (bu konu için kesin bir cevap bile olmadı - bir kişi için çalışan çözümler başkaları için hiç çalışmaz).

+2

belki do bir .each() işlevi ve animasyon bir komple her zaman eleman, bir sayacı artırma. Sayaç, animasyonlu öğelerin sayısına ulaştığında geri arama işlevinizi çalıştırın? – benhowdle89

+0

http://stackoverflow.com/questions/2897249/when-animating-how-fire-the-callback-only-when-all-elements-are-done –

+0

@ Chris'in olası yinelenmesi, bunu görmedim henüz soru - bu mükemmel! Ayrıca, @Riley ve @Ross 'yanıtlarına çok benzer. – Richard

cevap

5

hep solmaya son butona geri arama tetikleyecek @ Ross'un cevap alternatifi (ki ya hareketlendirmek için söylendi son düğmeye olabilir veya olmayabilir) olabilir:

var buttons = $(".buttons"); 
var numbuttons = buttons.length; 
var i = 0; 

buttons.fadeIn('fast', function() { 
    i++; 
    if(i == numbuttons) { 
     //do your callback stuff 
    } 
}); 
+1

Bu kolay görünebilir ve sadece iyi çalışır, ancak aşağıdaki yanıtı @Underworld tarafından açıklanan daha iyi bir şekilde yapabilirsiniz. – aalaap

1
var $buttons = $('.buttons'); 

$buttons.each(function (index) { 
    if (index == $buttons.length - 1) { 
     $(this).fadeIn('fast',function() { 
      // my callback 
     }); 
    } else { 
     $(this).fadeIn('fast'); 
    } 
}); 

Test edilmemişse, ancak bu, yalnızca son düğmeyi geri aramalıdır.

0

Çözümümün arkasındaki fikir bir sayaç tutmaktır. Bir animasyon bittiğinde, bu sayacı artırmanız yeterlidir, böylece son düğmede olduğunuz zamanı görebilirsiniz. Her şey bittiğinde sayacı tekrar sıfıra ayarlamayı unutmayın, çünkü bunu tekrarlamak isteyebilirsiniz (tekrar gizleyin ve tekrar gösterin).

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++; 
    } 
}); 
0
onClickBtnEdit = function(){ 
    var $EditDel = $($btnEdit).add($btnDel); 
    var btns = $EditDel.size(); 

    $EditDel.fadeOut("def",function(){     
     btns--; 
     if(btns===0){ 
      $($btnSave).add($btnCancel).fadeIn("slow"); 
     } 
    }); 
}; 
80

jQuery sürüm 1.6 bir promise tanıttı ve çok daha şık sayaçları ekleme aşıyor.

Örnek:

// 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 
}); 
+7

Yanıt bu olmalı. –

+0

@JonathanArkell, sanırım aynı –

+0

done() işlevindeki geriçağırım işlevi, her bir öğenin $ ('buttons') olarak mı, yoksa hepsi * çözüldüğünde mi çağrıldığını gösterir mi? – TimeEmit

14

tek geri arama içine ilgisiz eleman animasyonlar toplamak için bunu yapmak için:

$.when(
    $someElement.animate(...).promise(), 
    $someOtherElement.animate(...).promise() 
).done(function() { 
    console.log("Both animations complete"); 
}); 
+0

yeterli olacaktır Çok güzel, teşekkürler. – Mahn

+4

Ayrıca, bu sözleri bir dizide toplayabileceğinizi ve daha sonra, yaptığım gibi, 'apply' işlevini kullandığınız gibi: '$ .when.apply ($, animationPromises) .done (function() {console.log (") ";}});' – Mahn

+1

'' .promise' için '$ .when' argümanında arama yapmaya gerek yoktur - bu sizin için otomatik olarak yapılır – Alnitak

İlgili konular