2012-01-09 15 views
38

Jeśli wybierzesz klasę lub zbiór elementów do animacji z jQuery:

$('.myElems').animate({....}); 

I wtedy też użyć funkcji oddzwaniania, możesz skończyć z wiele niepotrzebnych połączeń animate().

var i=1; 
$('.myElems').animate({width:'200px'}, 200, function(){ 
    //do something else 
    $('#someOtherElem').animate({opacity:'1'}, 300, function(){   
     if (i>1) console.log('the '+i+'-th waste of resources just finished wasting your resources'); 
     i++; 
    }); 
}); 

Prawdopodobnie jest to po prostu zły kod i/lub projektu - ale czy jest coś, co mogę zrobić, że zarówno unika konieczności wiele animate() połączenia tylko z jednym z nich za pomocą zwrotnego, posiadające ładunek zbędnych callbacków wykonującego i wkręcanie mojego kodu/oczekiwanego zachowania?

Idealnie byłbym w stanie zakodować pojedynczy "jednorazowy" callback, który będzie uruchamiany tylko raz - w przeciwnym razie może jest skuteczny sposób na sprawdzenie, czy coś jest już animowane przez jQuery?

Przykład: http://jsfiddle.net/uzSE6/ (ostrzeżenie - pokaże obciążenie skrzynek ostrzeżeń).

+0

definiuje zmienną flagi w zakresie pliku lub w innym miejscu dostępnym przez 'animate()'. sprawdź go przed '$ (" # someOtherElem "). animate()' wywołaj i ustaw go w jego ciele, więc '$ (" # someOtherElem "). animate()' nie będzie wywoływane następnym razem. – fardjad

Odpowiedz

99

Można użyć when jak:

$.when($('.myElems').animate({width: 200}, 200)).then(function() { 
    console.log('foo'); 
}); 

http://jsfiddle.net/tyqZq/

Alterna te wersja:

$('.myElems').animate({width: 200}, 200).promise().done(function() { 
    console.log('foo'); 
}); 
+7

Podoba mi się to. Bardzo to lubię. Nie wiedziałem o tych funkcjach, to pomogło wiele :) – jammypeach

+5

+1 Znalazłem całkiem użyteczne dla '$ ('html, body'). Animate (...)' – Alvaro

2

można utworzyć zmienną, aby zablokować drugą + zwrotnego ...

var i=1; 
$('.myElems').animate({width:'200px'}, 200, function(){ 
    //do something else 
    $('#someOtherElem').animate({opacity:'1'}, 300, function(){   
     if (i>1) return; 
     else 
     { 
      console.log('the '+i+'-th waste of resources just finished wasting your resources'); 
      i++; 
     } 
    }); 
}); 

To zadziała tylko raz w każdym kolejnym zwrotnego zostanie anulowane :)

+3

Proponuję użyć innej nazwy zmiennej niż 'i', która jest powszechna i może zostać przypadkowo nadpisana, i dla jasności ustawiona na" true "lub" false ". – Blazemonger

+1

^Jasne, ale użyłem i, ponieważ było już dostępne w przykładowym kodzie, po prostu użyłem go lekko skorygowanego. Z punktu widzenia przejrzystości coś w stylu 'callbackdone' ustawione na wartości boolowskie miałoby większy sens. – bardiir

Powiązane problemy