Vous voulez écouter l'événement "fin" de la transition.
// d3 v5
d3.select("#myid").transition().style("opacity","0").on("end", myCallback);
// old way
d3.select("#myid").transition().style("opacity","0").each("end", myCallback);
- Cette démo utilise l'événement "end" pour enchaîner plusieurs transitions dans l'ordre.
- L' exemple de beignet livré avec D3 l'utilise également pour enchaîner plusieurs transitions.
- Voici ma propre démo qui change le style des éléments au début et à la fin de la transition.
De la documentation pour transition.each([type],listener)
:
Si le type est spécifié, ajoute un écouteur pour les événements de transition, prenant en charge les événements de «début» et de «fin». L'auditeur sera appelé pour chaque élément individuel de la transition, même si la transition a un délai et une durée constants. L'événement de démarrage peut être utilisé pour déclencher un changement instantané lorsque chaque élément commence la transition. L'événement de fin peut être utilisé pour lancer des transitions à plusieurs étapes en sélectionnant l'élément actuel this
, et en dérivant une nouvelle transition. Toutes les transitions créées lors de l'événement de fin hériteront de l'ID de transition actuel et ne remplaceront donc pas une transition plus récente qui était précédemment planifiée.
Voir ce fil de discussion sur le sujet pour plus de détails.
Enfin, notez que si vous souhaitez simplement supprimer les éléments après leur disparition (une fois la transition terminée), vous pouvez utiliser transition.remove()
.
d3.selectAll()
(au lieu de cela après la fin de chaque élément)? En d'autres termes, je veux juste rappeler une fonction une fois que tous les éléments ont terminé la transition..each
écouteur d'événement, ni l'"end"
événement. Il ne semble pas «enchaîner» les transitions. Le deuxième lien pointe vers un github qui ne se charge pas pour moi.La solution de Mike Bostock pour la v3 avec une petite mise à jour:
la source
if (transition.size() === 0) { callback(); }
function endall(transition, callback){ if(!callback) return; // ... }
ou, puisque c'est très certainement une erreur d'appeler cette fonction sans callback, lancer une exception être la manière appropriée de gérer la situation Je pense que cette affaire n'a pas besoin d'exception trop compliquéefunction endall(transition, callback){ if(!callback) throw "Missing callback argument!"; // .. }
enter()
et que nousexit()
voulons attendre la fin des trois, nous devons mettre du code dans le rappel pour nous assurer qu'il a été invoqué trois fois, non? D3 est tellement désordonné! J'aimerais avoir choisi une autre bibliothèque.Désormais, dans d3 v4.0, il existe une fonction permettant d'attacher explicitement des gestionnaires d'événements aux transitions:
https://github.com/d3/d3-transition#transition_on
Pour exécuter du code lorsqu'une transition est terminée, tout ce dont vous avez besoin est:
la source
transition.remove()
( link ), qui gère un cas d'utilisation courant de transition d'un élément de la vue: `` Pour chaque élément sélectionné, supprime l'élément à la fin de la transition, tant que l'élément n'a pas d'autres transitions actives ou en attente. Si le l'élément a d'autres transitions actives ou en attente, ne fait rien. "Une approche légèrement différente qui fonctionne également lorsqu'il y a de nombreuses transitions avec de nombreux éléments exécutés chacun simultanément:
la source
Ce qui suit est une autre version de la solution de Mike Bostock et inspirée du commentaire de @hughes à la réponse de @ kashesandr. Il effectue un seul rappel à
transition
la fin.Étant donné une
drop
fonction ...... nous pouvons étendre
d3
comme ça:En tant que JSFiddle .
Utilisez
transition.end(callback[, delayIfEmpty[, arguments...]])
:... ou avec un délai optionnel si
transition
est vide:... ou avec des
callback
arguments optionnels :d3.transition.end
appliquera le passécallback
même avec un videtransition
si le nombre de millisecondes est spécifié ou si le deuxième argument est vrai. Cela transmettra également tous les arguments supplémentaires aucallback
(et uniquement ces arguments). Surtout, cela n'appliquera pas par défaut lecallback
iftransition
est vide, ce qui est probablement une hypothèse plus sûre dans un tel cas.la source
Depuis D3 v5.8.0 +, il existe désormais un moyen officiel de le faire en utilisant
transition.end
. Les documents sont ici:https://github.com/d3/d3-transition#transition_end
Un exemple de travail de Bostock est ici:
https://observablehq.com/@d3/transition-end
Et l'idée de base est que rien qu'en ajoutant
.end()
, la transition renverra une promesse qui ne se résoudra pas tant que tous les éléments n'auront pas terminé la transition:Pour en savoir plus, consultez les notes de version de la version:
https://github.com/d3/d3/releases/tag/v5.8.0
la source
La solution de Mike Bostock améliorée par kashesandr + passant des arguments à la fonction de rappel:
la source
En fait, il existe une autre façon de faire cela en utilisant des minuteries.
la source
J'ai résolu un problème similaire en définissant une durée sur les transitions à l'aide d'une variable. Ensuite,
setTimeout()
j'appelais la fonction suivante. Dans mon cas, je voulais un léger chevauchement entre la transition et le prochain appel, comme vous le verrez dans mon exemple:la source