this 建议抓住几个过渡的结尾。 Uncaught TypeError: t.call is not a function 错误。代码如下:
Uncaught TypeError: t.call is not a function
var svg = d3.select('svg'); function endall(transition, callback) { if (typeof callback !== "function") throw new Error("Wrong callback in endall"); if (transition.size() === 0) { callback() } var n = 0; transition .each(function() { ++n; }) .each("end", function() { if (!--n) callback.apply(this, arguments); }); } for (var i=0;i<5;i++) { svg.append('rect') .attr("x",i*60) .attr("y",50) .attr("height",50) .attr("width",50) .style("fill","#ff0000"); } svg.selectAll("rect:not(.active)") .transition() .duration(1000) .style("fill","#00ff00") .call(endall, function() { alert("all done") });
jsfiddle 使用D3模板,效果很好。另一方面,当我把它移植到 jsfiddle 如果没有D3模板,我会得到同样的错误。
很明显我遗漏了什么,但我不明白是什么。
不产生错误的fiddle在v3上运行,而产生错误的fiddle在v5上运行。
transition.each("end",...) 对于事件:
transition.each("end",...)
如果指定了type,则为转换事件添加侦听器, 为转换中的每个元素调用。( v3 docs )
在d3v4和v5中,此方法被替换为 transition.on("end",...)
transition.on("end",...)
选择.on(类型名[,侦听器[,选项]])<>; 事件类型名。( current docs )
事件类型名。( current docs )
transition.each(function) 仍然可以用于对正在转换的每个项执行操作,但不能用于事件侦听。由于版本之间的这种变化,您会得到一个错误,即t.call不是一个函数(它是一个字符串: "end" ),警报不会触发。
transition.each(function)
"end"
对于d3v4或d3v5,请改用:
transition .each(function() { ++n; }) .on("end", function() { if (!--n) callback.apply(this, arguments); });
Updated fiddle