javascript - 如何检测 d3.js 力定向图中的元素拖动

标签 javascript svg d3.js

我在 d3.js 中有一个力导向图(非常棒:对 MB 和所有参与者的巨大荣誉!)。我希望能够以某种方式检测并返回当前正在拖动的任何节点的索引。

我知道我可以重新定义 d3.behavior.drag() 以将回调附加到拖动事件,但我想要 native force.drag 的所有行为并且为了添加这个而重复所有行为似乎很笨拙一点。以我的经验不足,也许我忽略了一些直接的方法来做到这一点?


嗯,是的,我应该更明确一点。这是我尝试过的:我使用了示例 here作为我的模型,修改它以适合我的目的,并在我去的时候学习 d3.js。我这样定义节点:

var circle = svg.append("svg:g").selectAll("circle")
    .data(force.nodes())
  .enter().append("svg:circle")
    .attr("class", "node")
    .attr("r", 6)
    .on("click", clicked)
    .on("dblclick", dblclick)
    .on("contextmenu", cmdclick)
    .on("drag", draghandler)
    .call(force.drag);

function draghandler(d){
    console.log(d);
    console.log(this);
}

clickdblclickcontextmenu 的事件处理程序完全符合我的预期;但是,当我尝试为 drag 添加事件处理程序时,它永远不会执行。我想象它失败是因为我用错了它,或者在错误的地方,或者因为行为是由 force.drag 控制的,我必须重新定义它来添加额外的行为我想要。

最佳答案

drag 事件不是由 circle 触发的,它是由拖动行为 ( source ) 触发的,调用 force.drag将返回该行为,您可以在那里设置一个监听器:

force.drag()
  .on("dragstart", function () {
    console.log(arguments);
  })

Demo , 查看控制台的输出

更新:

我 fork 了您发布的示例链接,它没有使用 d3.json 并且工作正常:demo

关于javascript - 如何检测 d3.js 力定向图中的元素拖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29592770/

相关文章:

html - 带有 <use> 标签的 SVG 不可见

javascript - 根据圆圈的大小包装气泡图

javascript - 将 Canvas 扩展到完整的浏览器窗口

javascript - Chrome 没有运行 D3.js

javascript - 返回一个虚拟的 json 响应

Javascript - 单击 svg 形状时调用函数。

javascript - Safari 中奇怪的 svg/path 动画行为

javascript - 新的 DIV 出现在另一个 Div 的悬停/鼠标悬停上

javascript - webkit/chrome Web Inspector 资源检查是如何工作的?

javascript - 我如何给某些边缘上课?