Javascript 动画完成后在d3.js中获取画布位置(cx/cy),以供将来参考?

Javascript 动画完成后在d3.js中获取画布位置(cx/cy),以供将来参考?,javascript,d3.js,Javascript,D3.js,如何在动画之后访问和存储D3对象的画布位置(cx/cy),以便将其用作下一个动画的起点 我有以下几点: var enterTransition = enter.transition() .duration(duration) .delay(function(d, i) { return i * delay; }) .attr("cx", function(d, i) { return Math.random()*width; }) .attr("cy", func

如何在动画之后访问和存储D3对象的画布位置(cx/cy),以便将其用作下一个动画的起点

我有以下几点:

var enterTransition = enter.transition()
    .duration(duration)
    .delay(function(d, i) { return i * delay; })
    .attr("cx", function(d, i) { return Math.random()*width; })
    .attr("cy", function(d, i) { return Math.random()*height; });
因此,我真的不知道我的节点在哪里结束

节点可能有子节点,因此会发生“单击”事件。如果用户单击该节点,我希望新的一批节点从父节点开始,并从父节点开始随机化。我定义我的节点(“泡泡”)如下

var bubbles = vis.insert("svg:g")
    .attr("class", "enter")
  .selectAll("g")
    .data(d.children)
  .enter().append("svg:circle")
    .attr("stroke", "black")
    .attr("fill", function(d, i) { return colors(i); })
    .attr("cx", function(d, i) { return d.cx0; })  // for illustration purposes
    .attr("cy", function(d, i) { return d.cy0; })  // for illustration purposes
    .attr("r", function(d, i) { return rScaled(d.duration); })
    .style("cursor", function(d) { return !d.children ? null : "pointer"; })
    .on("click", down);
My
d.cx0
d.cy0
表示父节点的cx/cy


如何在动画之后获取此信息并将其保存以供参考?

在您用于设置
“cx”
“cy”
的功能中:


(由于不太熟悉您所拥有的以及您试图实现的目标,很可能有一种更合适的方法来实现这一点,它不依赖于读取父对象的属性,我认为这有点昂贵)。

在用于设置
“cx”
“cy”
的函数中:


(由于不太熟悉您所拥有的以及您试图实现的目标,很可能有一种更合适的方法来实现这一点,它不依赖于读取父对象的属性,我认为这有点昂贵)。

我尝试了一下,但似乎cx/cy没有被正确拉动(气泡仍然出现在0,0)。使用调试工具(Firebug或Chrome)
每次都会将此
报告为
窗口
。我是不是在什么地方把推荐人搞砸了?嗯。令人惊讶的是,
这个
窗口
。您是从传递给
attr()
的匿名函数中记录它,就像我拥有它一样,还是从其中调用另一个函数并从另一个函数中记录(这将丢失
上下文)?如果这不是问题所在,那么它可能无法像处理常规DOM元素那样处理svg。我不是很确定。我仍然在从匿名函数调用它,使用:
.attr(“cx”,函数(d,I){return d3.select(this.parentNode).attr(“cx”);}
我尝试了一下,但似乎没有正确地拉动cx/cy(气泡仍然出现在0,0处)。使用调试工具(Firebug或Chrome)
每次都会将此
报告为
窗口
。我是不是在什么地方把推荐人搞砸了?嗯。令人惊讶的是,
这个
窗口
。您是从传递给
attr()
的匿名函数中记录它,就像我拥有它一样,还是从其中调用另一个函数并从另一个函数中记录(这将丢失
上下文)?如果这不是问题所在,那么它可能无法像处理常规DOM元素那样处理svg。我不是很确定。我仍然在从匿名函数调用它,使用:
.attr(“cx”,函数(d,I){return d3.select(this.parentNode).attr(“cx”);}
.attr("cx", function(d, i) { 
  // In here, the "this" keyword refers to the svg circle. So:
  var parent = this.parentNode;// That's the parent you're interested in
  return d3.select(parent).attr('cx');
})