javascript - 两个 'calls' 到 d3 中的拖动事件

标签 javascript d3.js drag force-layout

我在 d3 中使用力导向布局,但在开发过程中遇到了一些障碍。

    var circle = svg.append("svg:g").selectAll("circle") 
     .data(force.nodes()) 
   .enter().append("svg:circle")   
     .attr("r", function( d ) { 
      return d.fValue; 
     }) 
     .style('fill', function( d ) { 
       return strokeColor( d.name );   
     })
     .call(force.drag);

基本上,我想向 force.drag 定义的“拖动”行为添加更多事件监听器 - 也就是说,我想确保节点在拖动时改变颜色(而不是在鼠标悬停时)。我能想到的唯一两种方法是以某种方式更改 force.drag 函数或定义新的拖动行为。

我不知道如何使用第一种方式,但是当我尝试第二种方式时,方法链将只接受第二个拖动事件,而忽略第一个 force.drag 事件。

.call(customDrag)
.call(force.drag); // This would work

如何附加另一个拖动事件监听器或修改现有的 force.drag 以适应我要添加的新动画?

提前致谢

最佳答案

定义你自己的监听器,因为 force.drag 只调用 force.tick() afaik:

  var node_drag = d3.behavior.drag()
        .on("dragstart", dragstart)
        .on("drag", dragmove)
        .on("dragend", dragend);
  vis.selectAll("g.node").call(node_drag)

然后确保在 dragmove 中调用 tick()

我这样做是为了通过强制布局添加拖放支持。 see my stackoverflow question & answer for an example

关于javascript - 两个 'calls' 到 d3 中的拖动事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11297399/

相关文章:

javascript - 如何为 jsviews 创建自定义属性处理程序?

javascript - Knockout.js:选择下拉问题,即使使用 "selected item"提供,也始终将 "initial data"设置为第一个选项

javascript - 根据数组计算对象的求和值并更新为总计

javascript - json 文件未从 Visual Studio 2013 加载

html - 触摸设备上的可拖动属性

javascript - 拖动时更改光标

javascript - 使用输入 [type = file]/拖放 javascript jquery 在 chrome 中崩溃

javascript - 将对象字面量转换为数组

jquery - 如何让我的 D3 map 缩放到某个位置?

javascript - 如何将 d3js 中的拖动行为与 Leapjs 结合使用