2011-04-28 28 views
8

que estoy tratando de animar un conjunto de elementos al mismo tiempo (casi, hay un pequeño retraso entre cada animación):jQuery animado múltiple() de devolución de llamada

$('.block').each(function(i){ 
    $(this).stop().delay(60 * i).animate({ 
    'opacity': 1 
    }, { 
     duration: 250, 
     complete: mycallbackfunction // <- this fires the callback on each animation :(
    }); 
}); 

¿Cómo puedo ejecutar una función de devolución de llamada después de todas las animaciones tienen ¿terminado?

+0

que puede tener cada anim individuo. Incremente un valor, y si ese valor es = número de animaciones, ejecute la función real – davidosomething

+1

¿Hay alguna razón por la que no puede llamar a mycallbackfunction después de $ (".bloquear") cada declaración? o estoy malinterpretando tu código? –

+0

sí. Si hago eso, la función se ejecutará de inmediato. Quiero esperar a que finalicen las animaciones, luego ejecutarlo – Alex

Respuesta

5

Utilice un cierre alrededor de una variable de contador.

var $blocks = $('.block'); 
var count = $blocks.length; 
$blocks.each(function(i){ 
    $(this).stop().delay(60 * i).animate({ 
    'opacity': 1 
    }, { 
     duration: 250, 
     complete: function() { 
     if (--count == 0) { 
      // All animations are done here! 
      mycallbackfunction(); 
     } 
     } 
    }); 
}); 

Tenga en cuenta el guardado de la lista de elementos en la variable $ block para guardar una búsqueda.

+0

acaba de hacer la disminución en 'myCallbackFn()' ... pero esta es la única respuesta que veo –

+0

Para hacer la disminución en 'mycallbackfunction()', debe definirse en el mismo ámbito que 'count' . El ejemplo de OP no mostró dónde se definió 'mycallbackfunction()'. – kcbanner

+0

gracias! esto parece funcionar: D pero tienes un error: debería ser 'if (count == 0) mycallbackfunction();' – Alex

1
var block = $('.block'); 
    block.each(function(i){ 
    $(this).stop().delay(60 * i).animate({ 
    'opacity': 1 
    }, { 
     duration: 250, 
     complete: i== (block.length-1) ? myCallbackFunction : function(){} 
    }); 
    }); 
1
$('.block').each(function(i){ 
    $(this).stop().delay(60 * i).animate({ 
    'opacity': 1 
    }, { 
     duration: 250, 
     complete: ((i == $('.block').length - 1) ? mycallbackfunction : null) 
    }); 
}); 
4

Desde jQuery 1.5, puede utilizar $.when[docs], que es un poco más fácil de escribir y comprender:

var $blocks = $('.block'); 

$blocks.each(function(i){ 
    $(this).stop().delay(60 * i).animate({ 
    'opacity': 1 
    }, { 
     duration: 250 
    }); 
}); 

$.when($blocks).then(mycallbackfunction); 

DEMO

+0

Eso disparará la devolución de llamada incluso si las animaciones se detuvieron mediante '.stop()'. – antitoxic

4

Felix Kling's answer disparo la devolución de llamada cuando no hay animación queda por hacer. Esto hace que la devolución de llamada inicie incluso si la animación es detenida a través de $el.stop() y por lo tanto no se completa hasta el final.

he encontrado un method by Elf Sternberg utilizando objetos diferido los cuales he implementado en este jsFiddle:

http://jsfiddle.net/8v6nZ/

Cuestiones relacionadas