我有一个非常简单的D3用例:
目前,我计划在退出选择上进行转换,延迟时间为5秒,而合并更新选择(包括附加的输入选择)的转换会立即运行,持续时间为4.5秒。
更新转换是"链接" - 我使用transition.each()为更新选择中的每个元素安排第二次转换,并监听" end"事件
问题:
如果用户点击"更新"快速两次或多次,exit()转换无法完成,导致屏幕上剩余的框。
我无法弄清楚为什么会发生这种情况 - 对我而言,对我的现有元素的转换如何被覆盖并不明显。
以下是一个工作示例:http://jsfiddle.net/yw8qmdLe/3/
提前致谢!
JavaScript的:
var dat = [0,1,2,3,4,5];
var svg = d3.select("#main");
svg.selectAll("div.box").data(dat).enter().append("div").attr("class","box").text(function(d,i){return d});
var button = d3.select("#button")
button.on("mousedown",function(){
dat.push(dat[dat.length-1] + 1);
dat.shift();
var update = svg.selectAll("div.box").data(dat,function(d,i){return d});
update.style("border-left","0px solid #0000ff").text(function(d,i){return d + ": update"});
update.enter().append("div").attr("class","box").text(function(d,i){return d + ": enter"}).style("border-left","0px solid #00ff00");
update.exit()
.style("border-left","40px solid #000000")
.text(function(d,i){
return d + ": exit";
}).transition().delay(5000).duration(1000)
.style("width",function(d,i){
//console.log(this.__transition__);
return "0px";
})
.style("border-left-width","0px")
.text("")
.remove();
update.transition().duration(4500).style("border-left-width","40px").each("end",function(d,i){
d3.select(this).transition().duration(700).style("border-left-width","0px")
})
})