Dans JQuery, est-il possible d'obtenir une fonction de rappel après avoir défini une nouvelle règle css?

J'ai un $('.element').css("color","yellow") et j'ai besoin que l'événement suivant ne soit qu'après celui-ci, quelque chose ressemble à $('.element').css("color","yellow",function(){ alert(1); }) J'ai besoin de ceci parce que:

 $('.element').css("color","yellow"); alert(1); 

Les événements se produisent à un moment presque, et ce moment appelle le bug dans l'effet d'animation (l'alerte (1) est ici, par exemple, dans le module réel c'est l'animation)

Les retours de rappel ne sont nécessaires que pour les fonctions asynchrones. La fonction css sera toujours terminée avant que l'exécution du code ne se poursuive, donc un rappel n'est pas nécessaire. Dans le code:

 $('.element').css('color', 'yellow'); alert(1); 

La couleur sera modifiée avant que l'alerte ne soit déclenchée. Vous pouvez le confirmer en exécutant:

 $('.element').css('color', 'yellow'); alert($('.element').css('color')); 

En d'autres termes, si vous souhaitez utiliser un rappel, exécutez-le simplement après la fonction css:

 $('.element').css('color', 'yellow'); cb(); 

Vous pouvez faire preuve de promesses

 $('.element').css("color","yellow").promise().done(function(){ alert( 'color is yellow!' ); }); 

http://codepen.io/onikiienko/pen/wBJyLP

Il n'y a pas de rappel pour la fonction jquery css. Cependant, nous pouvons faire le tour, ce n'est pas une bonne pratique, mais ça marche.

Si vous l'appelez immédiatement après la modification

 $('.element').css('color','yellow'); alert('DONE'); 

Si vous voulez que cette fonction ait été appelée juste après la modification, effectuez une boucle d'intervalle.

 $('.element').css('color','yellow'); var detectChange = setInterval(function(){ var myColor = $('.element').css('color'); if (myColor == 'yellow') { alert('DONE'); clearInterval(detectChange); //Stop the loop } },10); 

Pour éviter une boucle infinie, définir une limite

 var current = 0; $('.element').css('color','yellow'); current++; var detectChange = setInterval(function(){ var myColor = $('.element').css('color'); if (myColor == 'yellow' || current >= 100) { alert('DONE'); clearInterval(detectChange); //Stop the loop } },10); 

Ou utiliser settimeout comme mentionné ci-dessus /

Vous pouvez utiliser setTimeout pour augmenter le temps de veille entre l'alerte et le css comme ceci:

 function afterCss() { alert(1); } $('.element').css("color","yellow"); setTimeout(afterCss, 1000); 

Cela fera apparaître l'alerte 1 seconde après que les modifications css aient été commises.

Cette réponse est désuète, donc vous pouvez utiliser les promesses d'ES6 comme la réponse ci-dessus.


 $('.element').css("color", "yellow").promise().done(function(){ // The context here is done() and not $('.element'), // be careful when using the "this" variable alert(1); });