Berikut ini adalah versi lain dari solusi Mike Bostock dan terinspirasi oleh komentar @hughes untuk jawaban @ kashesandr. Itu membuat panggilan balik tunggal transition
di akhir.
Diberikan drop
fungsi ...
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);
}
... kita dapat memperpanjang d3
seperti ini:
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;
}
Sebagai JSFiddle .
Penggunaan transition.end(callback[, delayIfEmpty[, arguments...]])
:
transition.end(function() {
console.log("all done");
});
... atau dengan penundaan opsional jika transition
kosong:
transition.end(function() {
console.log("all done");
}, 1000);
... atau dengan callback
argumen opsional :
transition.end(function(x) {
console.log("all done " + x);
}, 1000, "with callback arguments");
d3.transition.end
akan menerapkan lulus callback
bahkan dengan kosong transition
jika jumlah milidetik ditentukan atau jika argumen kedua benar. Ini juga akan meneruskan argumen tambahan apa pun ke callback
(dan hanya argumen itu). Yang penting, ini tidak akan secara default menerapkan callback
jika transition
kosong, yang mungkin merupakan asumsi yang lebih aman dalam kasus seperti itu.