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 ...
function drop(n, args, callback) {
for (var i = 0; i < args.length - n; ++i) args[i] = args[i + n];
args.length = args.length - n;
callback.apply(this, args);
}
... nous pouvons étendre d3
comme ça:
d3.transition.prototype.end = function(callback, delayIfEmpty) {
var f = callback,
delay = delayIfEmpty,
transition = this;
drop(2, arguments, function() {
var args = arguments;
if (!transition.size() && (delay || delay === 0)) { // if empty
d3.timer(function() {
f.apply(transition, args);
return true;
}, typeof(delay) === "number" ? delay : 0);
} else { // else Mike Bostock's routine
var n = 0;
transition.each(function() { ++n; })
.each("end", function() {
if (!--n) f.apply(transition, args);
});
}
});
return transition;
}
En tant que JSFiddle .
Utilisez transition.end(callback[, delayIfEmpty[, arguments...]])
:
transition.end(function() {
console.log("all done");
});
... ou avec un délai optionnel si transition
est vide:
transition.end(function() {
console.log("all done");
}, 1000);
... ou avec des callback
arguments optionnels :
transition.end(function(x) {
console.log("all done " + x);
}, 1000, "with callback arguments");
d3.transition.end
appliquera le passé callback
même avec un vide transition
si le nombre de millisecondes est spécifié ou si le deuxième argument est vrai. Cela transmettra également tous les arguments supplémentaires au callback
(et uniquement ces arguments). Surtout, cela n'appliquera pas par défaut le callback
if transition
est vide, ce qui est probablement une hypothèse plus sûre dans un tel cas.