11540 sujets

JavaScript, DOM et API Web HTML5

Bonjour, voici mon problème :

Le code ci dessous permet de cacher tous les éléments similaires à l'élément actif.

$(this).siblings().slideUp();


Je souhaite de mon coté faire un callback après disparition, je fais donc :

$(this).siblings().slideUp( function(){console.log("coucou !")});


Le problème, c'est que "coucou !" sera affiché autant de fois qu'il y à eu de "siblings" à cacher !

Exemple :


<ul>
<li>azerty</li>
<li>azerty</li>
<li>azerty</li>
<li>azerty</li>
<li>azerty</li>
<li>azerty</li>
</ul>


avec le code :


$("ul li").on("click", function()
{
$(this).siblings().slideUp(200, function(){
console.log("coucou !");
});
});



Devinette : combien de fois va être affiché "coucou !" dans la console ?

Mon but : lancer cette fonction une seule fois.


Un grand merci par avance et une bonne journée,
Moi.
Modifié par Cr4sH (05 Apr 2013 - 13:59)
si tu sérialise simplement les fonctions
$("ul li").on("click", function()
{
$(this).siblings().slideUp();
console.log("coucou !");
});


çà fait pas ce que tu souhaites ?
Modifié par Zebrou (04 Apr 2013 - 20:34)
@Zebrou: Dans ta suggestion, le `console.log` n'attends pas la fin de l'animation pour s'afficher.

On pourrait cependant y aller comme ça: (exemple)


var $li = $(this).siblings();
$li.slideUp().promise().then(function() { console.log("coucou") });


Doc: http://api.jquery.com/promise/
Modifié par SBoudrias (05 Apr 2013 - 04:31)
Bonjour à tous les deux !

SBoudrias, merci pour ton exemple, cependant comme l'a justement remarqué Zebrou, le console.log est executé au même moment que $(this).siblings().slideUp();.

Quant à toi, Zebrou, eh bien merci beaucoup, j'ai bien l'impression que c'est ce que je recherchai ! Je ne sais pas comment tu as trouvé cette fonction promise(), mais je ne suis jamais tombé dessus auparavant !

Un grand merci donc à vous, en vous souhaitant un très bon week-end.

Amicalement.