2010-01-09 5 views
0

J'essaye de faire ce qui suit:jquery animation de plusieurs éléments

J'ai deux ensembles d'éléments DOM sur une page. Tous les éléments du premier ensemble portent la classe display-element, et le deuxième ensemble d'éléments porte la classe edit-element.

Maintenant, j'ai un bouton (id = edit-button). Quand je clique sur ce bouton, je veux que tous les display-elements disparaissent, et tous les edit-elements apparaissent.

Je naturellement ai fait:

$('#edit-button').click(function(){ 
    $('.display-element').fadeOut(300, function() { 
     $('.edit-element').fadeIn(300); 
    }); 
}); 

J'ai trouvé à ma grande surprise que cela ne fonctionne pas comme prévu. Ce qui est arrivé: dès le premier élément avec la classe display-element fané dehors, tout le edit-elements a commencé la décoloration dans

Maintenant, est-il un moyen facile (peut-être quelque chose dans la documentation que j'ai raté) à l'aide que je peux avoir tout. edit-elements commencer à s'estomper dans seulement après que tout display-elements s'est estompé?

Merci
HJR

+0

Vous dites que les éléments d'élément d'affichage ne disparaissent pas tous en même temps? C'est ce qui devrait arriver. –

+0

Je ne dis pas grand-chose. Je comprends que le comportement que j'observe est le comportement attendu. Ce que je veux savoir, c'est s'il existe une méthode api astucieuse de l'API jQuery qui va m'aider à faire ce que je veux faire (et contournera le comportement que j'observe maintenant). – jrharshath

Répondre

0

Pourquoi cela se produit, vraiment? Je veux dire, il semble que vous démarrez les animations en même temps (il n'y a qu'un seul appel à .fadeOut après tout, non?). Je suppose que c'est parce que $() donne un tableau et quand vous appelez .fadeOut, jQuery parcourt le tableau et effectue tout ce qu'il effectue pour chacun de ses éléments. À partir du premier. Puisque le rappel est "attaché" à chaque animation, vous voyez l'effet visible du premier rappel. J'imagine que vous pourriez contourner cela en parcourant le tableau des éléments retournés vous-même et en vous assurant que vous ne reliez le rappel qu'au dernier.

$('#edit-button').click(function(){ 
    var display_elements = $('.display-element'); 
    var len = display_elements.length; 
    for (var i = 0; i < len-1; i++) { 
     $(display_elements[i]).fadeOut(300); // no callback 
    } 
    $(display_elements[len-1]).fadeOut(300, function() { 
     $('.edit-element').fadeIn(300); 
    }); // last element - attach callback 
}); 

Je suis désolé si le code est éteint, je dois admettre que mon javascript-fu est pas très forte :)

0

La solution est d'utiliser un setTimeout sur la disparition progressive de la fonction

$('#edit-button').click(function(){ 
    $('.display-element').fadeOut(300); 
setTimeout("$('.edit-element').fadeIn(300);", 300); 
}); 

cette fonction javascript va retarder le déclenchement du la disparition progressive de la fonction 300 miliseconds

+0

cela va fonctionner à peu près, mais ... les durées ne sont pas si fiables, surtout en millisecondes .. – jrharshath

3

Eh bien, ayant trouvé aucune « méthode API nifty », je résolus de ceci:

$('#edit-button').click(function() { 
    var displays = $('.display-element'); 
    var counter = 0; 
    var max = displays.length; 
    displays.fadeOut(300, function() { 
     counter++; 
     if(counter>=max) $('.input-element').fadeIn(300); 
    } 
}); 

Ceci est essentiellement @ la réponse de shylent, avec plus 'javascript-fu :)

+0

Ah oui, c'est certainement mieux :) – shylent

0

J'ai juste couru un problème similaire et a trouvé l'option de rappel « étape » a donné le comportement souhaité.

étape: Une fonction à appeler après chaque étape de l'animation.

^

Faites défiler jusqu'à la démonstration pour l'utilisation de l'étape et vous verrez comment il vous permettra d'appeler animer sur un seul objet puis utilisez pas pour mettre à jour le reste de votre jeu à chaque étape l'animation. De cette façon, vous n'avez qu'un rappel déclenché à la fin de l'animation.

+0

Malheureusement, cela ne fonctionne pas avec fadeToggle(), j'ai donc utilisé votre solution de compteur pour ceux .. Cheers! – elDuderino