2010-05-24 5 views
6

jQuery'de animasyon yaparken, yalnızca TÜM öğeler her öğe için değil, animasyon yapılırken geri çağırma işlemi için en iyi uygulama nedir? ÖrneğinAnimasyon yaparken, sadece tüm elementler ne zaman yapılırsa geri çağırmanın nasıl tetiklenir?

:

$('.someElements').fadeOut('fast', function() { 
    // dont do this until ALL elements are done fading 
} 
+0

Am Ben senin soru üzerine karıştı? Tüm bu öğeler animasyonlarını aynı anda bitirmelidir. Hepsi 'hızlı' süresini alırlar, böylece hepsi aynı zamanda bitiyor. – Tejs

+0

Geri arama işlemini sadece ** bir kez ** mi iptal etmek istersiniz? –

+0

Tejs: Justin'in aşağıdan bahsettiği gibi, koleksiyondaki her eleman için bir geri arama başlayacaktır. Ve Felix, evet, sadece geri bildirimi bir kez ateşlemek istiyorum. Mikrospino'nun cevabıyla aşağıya gitmeye karar verdim. –

cevap

4

Bu denemek için bir pasajı olabilir ... yapmanız gereken herhangi işlemi geri arama özel bir kod olabilir Geri adım atmak zorundasınız.

DÜZENLEME (başka şekilde):

Ayrıca tüm unsurları ancak son birini yakalayabilirsiniz.

$('.someElements').not(.someElements:last).fadeOut(); 

ve sonra yalnızca kendisine geri arama ile

$('.someElements:last').fadeOut(fast, function(){ 
    // do something, it's the end of the world 
}; 
+1

Harika! Ancak, karşılaştırmanın gerçekleşmesini sağlamak için durum (--numberOfElements> 0) olmalıdır. Karşılaştırmadan önce değişkeni azaltmak için. –

+0

- bir LeftHandSideExp işlecidir.İfade önce azalır, sonra karşılaştırmayı değerlendirir. Son döngüde olduğunuzu varsayalım: 1 öğeniz var, ifade şu şekilde: 1--> 0? Yanlış, geri dönme, bir sonraki hatta git ve uyarı aramayı başlat. – microspino

+1

Bunun çalışması için, koşul (--numberOfElements> 0) – aghoshx

2

Bu uyarınca, büyük bir sorudur jQuery docs:

birden elemanları animasyonlu ise, o eşleşti başına geri arama kez gerçekleştirilir dikkat etmek önemlidir öğe, bir bütün olarak animasyon için bir kez değil.

yapabildin bu kısıtlamaya bir çözüm için:

  • Numaralandırma .someElements eşleşen tüm öğeleri ve her biri için ayrı bir geri arama kurdu.
  • Toplam kaç tane geri arama olduğunu takip eden count değişkenine sahip olursunuz. sayım 0'a geldiğinde o 0.

ulaşıncaya kadar geri arama olarak

  • , bütün geri aramalar tamamlandıktan, count eksiltme ve tüm elemanlar animasyon yapılır da sağlanmış olacaktır.

    var numberOfElements = $('.someElements').length; 
    
    $('.someElements').fadeOut(fast, function() { 
        if(numberOfElements-- > 0) return; 
        alert('call the Fireman!'); 
    }); 
    

    uyarı sonuna kadar sadece bir yer tutucudur mı: Buradan, daha sonra

  • +0

    Teşekkürler Justin! Bu, geri çekmenin sadece bir kez ateş etmesini istiyorsanız biraz detay verir, ancak her bir animasyon için de bir şeye ihtiyacınız olduğunda harikadır. Bu daha basit vaka için microspino'nun cevabı ile giderdim. –

    0

    Daha yeni jQuery bültenleri (sürüm 1.6 ve sonrası) bir promise fikrini içerir bir fadeout ekleyin. Bu işlevi kullanmak bir geçici çözüm ihtiyacını ortadan kaldırır. Örneğin:

    // define the animation on many elements 
    $('.someElements').fadeOut('fast'); 
    
    // define the promise that is called once all element animations are done 
    $('.someElements').promise().done(function() { 
        // put callback actions here 
    });