【问题标题】:how to detect element drag in d3.js force directed graph如何在 d3.js 强制有向图中检测元素拖动
【发布时间】:2015-04-12 18:09:05
【问题描述】:

我在 d3.js 中有一个力有向图(非常棒:对 MB 和所有相关人员表示敬意!)。我希望能够以某种方式检测并返回当前被拖动的任何节点的索引。

我知道我可以重新定义 d3.behavior.drag() 以将回调附加到拖动事件,但我想要原生 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 事件处理程序中执行此操作。这不涉及重新定义。
  • 非常感谢@LarsKotthoff,这是我的第一个想法,但显然我做错了。增加了进一步的说明。
  • 我认为在这种情况下事件是force.drag

标签: javascript svg d3.js


【解决方案1】:

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

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

Demo,查看控制台输出

更新:

我分叉了您发布的示例链接,它不使用d3.json,它工作正常:demo

【讨论】:

  • 非常感谢 Mauricio,这很有启发性,看起来很有希望;但是,您在 d3.json() 回调的上下文中调用 force.drag()。在我的模型 MB 示例中,未使用 d3.json()。如果我在我的上下文中尝试它,脚本的全局级别,我会得到:“Uncaught TypeError: Cannot read property 'on' of undefined"。我在哪里可以调用force.drag 来设置那个监听器?
  • 你应该在变量force创建之后设置它,我已经更新了我的答案
  • 您的回答既富有启发性又正确;但是,我无法复制您的成功。为了说明我的持续问题,我将我的代码复制到jsfiddle,却发现您的解决方案在那里完美运行。但是,在本地,我继续收到以下错误:TypeError: this[type] is undefined d3.v2.js:3005TypeError: path is undefined force-directed-edges.html:274 为了进一步说明,我已经放置了页面here,在我的浏览器中,它失败了。有什么想法吗?
  • 您现在提出的问题超出了原始问题的范围,但是我从代码中看到 d3 的版本不是最新的,d3 的source 上有一个检查,它不在你有的本地d3版本的源代码,这一行不见了:if (!arguments.length) return drag;
  • 是的!在本地,我从这个 url http://mbostock.github.com/d3/d3.js?1.29.1 加载 d3.js,我认为我是从一些较旧的示例继承而来的。使用来自 github repo 的最新版本的 d3.min.js 修复了它。超出、超出和超出范围。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多