我已将以下内容放在一起 - http://jsfiddle.net/hiwilson1/c48dt2kb/。
此处的关键代码:
function generateNodes(p) {
var node = svg.append("circle")
.data([p])
.call(force.drag)
.attr("class", "node")
.attr("fill", "black")
.attr("r", 0.1)
.transition()
.attr("r", 5)
.transition().delay(20000)
.attr("r", 0.1)
.style("opacity", 0.1)
.remove()
.each("end", function() {
force.links().forEach(function(link, i) {
if (link.source == force.nodes()[0] || link.target == force.nodes()[0]) {
force.links().splice(i, 1)
}
})
svg.selectAll("line").data(force.links()).exit().remove()
force.nodes().shift()
})
force.nodes().push(p)
generateLinks(p);
force.start()
}
如果在"十字准线"的半径范围内有任何其他节点,则在鼠标单击时会生成一个节点。它们与最近生成的节点相关联。 20000ms后,节点和链接应该消失。目前对节点工作正常,链接不太好 - 当关联的节点被删除时,它们都不会被删除。 @Lars Kotthoff提到迭代某些东西并从迭代中移除那些东西但是1>这是一个坏主意。我看不到其他方法可以实现我想要的东西2>如果你正在迭代对象肯定会出现任何问题"跳过"你正在迭代的东西被否定了?
答案 0 :(得分:1)
我已更正您的代码,请参阅http://jsfiddle.net/hxyyhu6b/1/
主要原则:每个链接都获取id,并使用id选择器删除。
现在删除函数迭代器:
.each("end", function(d) {
for(var i= 0; i<force.links().length;){
var link = force.links()[i]
if ((link.source == d) || (link.target == d)) {
force.links().splice(i, 1)
svg.select("#" + link.id).remove()
}
else {i++}
}
force.nodes().splice(force.nodes().indexOf(d), 1)
})