【问题标题】:D3.js force layout with drag/zoom/pan and join nodes capabilitiesD3.js 具有拖动/缩放/平移和连接节点功能的强制布局
【发布时间】:2015-09-07 11:05:10
【问题描述】:

基本上,我想做的是合并这两个例子:

http://bl.ocks.org/mbostock/6123708

http://bl.ocks.org/benzguo/4370043

我想使用按键来选择是要拖动节点还是画线,如下所示:

function dragstarted( d ) {
    d3.event.sourceEvent.stopPropagation();

    if ( d3.event.sourceEvent.ctrlKey ) {
        // drag a line
    } else {
        // drag the node
    }
}

dragstart 事件上调用dragstarted 函数。在这种情况下,我应该停止这个节点的拖动事件,但我不知道怎么做。我试着打电话

d3.select( this ).on('.drag', null);

没有结果。

另一种选择是使用此函数为每个节点订阅mousedown.drag

function dragDecisor( d ) {
    if ( d3.event.ctrlKey ) {
        console.log( 'Draw a line...' );
    } else {
        console.log( 'Drag a node...' );
    }
}

但是我需要让拖动事件传播,似乎没有明确的方法来做到这一点。正如 mbostock 所述,我尝试创建一个事件(我无法发布更多链接,请参阅 d3 问题 #100)。

有什么建议吗?

【问题讨论】:

    标签: javascript events d3.js drag-and-drop


    【解决方案1】:

    我现在可以按住 ctrl 拖动节点。

    我标记了一个名为 ctrlPressed 的标志

    function mousedown() {
      if (!mousedown_node && !mousedown_link) {
        // allow panning if nothing is selected
        vis.call(d3.behavior.zoom().on("zoom"), rescale);
        return;
      }
        //marking the ctrlKey press flag
      if(d3.event.ctrlKey){
          ctrlPressed = true;
      } else {
          ctrlPressed = false;
      }
    }
    

    然后在鼠标移动中,如果按下 CTRL 键,我添加了创建和更新行的条件

    function mousemove() {
      if (!mousedown_node) return;
      if(!d3.event.ctrlKey){
            // update drag line
      drag_line
          .attr("x1", mousedown_node.x)
          .attr("y1", mousedown_node.y)
          .attr("x2", d3.svg.mouse(this)[0])
          .attr("y2", d3.svg.mouse(this)[1]);
      } else {
        mousedown_node.x = d3.svg.mouse(this)[0];
        mousedown_node.y = d3.svg.mouse(this)[1];  
      }
    
    }
    

    我的工作小提琴here

    希望对您有所帮助!

    【讨论】:

    • 酷!我没有意识到第二个示例使用的是 d3 v2。使用 v3 我遇到了一些问题,因为我似乎无法在 vis 对象上使用调用函数。你知道怎么解决吗?
    • 是的,V3 有一些我无法解决的问题 :)
    猜你喜欢
    • 1970-01-01
    • 2012-09-22
    • 2014-08-29
    • 2012-11-06
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    相关资源
    最近更新 更多