Berikut ini adalah versi lain dari solusi Mike Bostock dan terinspirasi oleh komentar @hughes untuk jawaban @ kashesandr. Itu membuat panggilan balik tunggal transitiondi akhir.
Diberikan dropfungsi ...
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 d3seperti 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 transitionkosong:
transition.end(function() {
console.log("all done");
}, 1000);
... atau dengan callbackargumen opsional :
transition.end(function(x) {
console.log("all done " + x);
}, 1000, "with callback arguments");
d3.transition.endakan menerapkan lulus callbackbahkan 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 callbackjika transitionkosong, yang mungkin merupakan asumsi yang lebih aman dalam kasus seperti itu.