Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript D3.js对象之间的动态连接器_Javascript_Svg_D3.js_Connector - Fatal编程技术网

Javascript D3.js对象之间的动态连接器

Javascript D3.js对象之间的动态连接器,javascript,svg,d3.js,connector,Javascript,Svg,D3.js,Connector,我对JS和D3都很陌生,我在谷歌上搜索了一吨,但只找到了一些太高级的例子 我正在做一个简单的决策图实现,我一直在尝试用一条线/路径连接两个节点。可以使用鼠标移动对象,并且路径应始终更新以反映对象的位置 这是我的基本知识来源,但我不太明白如何用它做一些聪明的事情 以下是我到目前为止的情况: 不需要花哨的东西,只需要了解如何创建连接器,并在拖动对象时动态更新连接器。非常感谢 要在两个圆之间画一条线,您不需要任何特殊的东西——只需要行元素 var line = svg.append("line")

我对JS和D3都很陌生,我在谷歌上搜索了一吨,但只找到了一些太高级的例子

我正在做一个简单的决策图实现,我一直在尝试用一条线/路径连接两个节点。可以使用鼠标移动对象,并且路径应始终更新以反映对象的位置

这是我的基本知识来源,但我不太明白如何用它做一些聪明的事情

以下是我到目前为止的情况:


不需要花哨的东西,只需要了解如何创建连接器,并在拖动对象时动态更新连接器。非常感谢

要在两个圆之间画一条线,您不需要任何特殊的东西——只需要
元素

var line = svg.append("line")
        .style("stroke", "black")
        .attr("x1", 150)
        .attr("y1", 100)
        .attr("x2", 250)
        .attr("y2", 300);
动态更新位置有点困难。目前,您无法区分哪些圆正在被拖动。一种方法是向
g
元素添加一个区别类

var g1 = svg.append("g")
        .attr("transform", "translate(" + 150 + "," + 100 + ")")
        .attr("class", "first")
        ...
另一个也一样。现在,您可以在
dragmove
函数中打开该类,并更新直线的起点或终点坐标

if(d3.select(this).attr("class") == "first") {
            line.attr("x1", x);
            line.attr("y1", y);
} else {
            line.attr("x2", x);
            line.attr("y2", y);
}

完整的例子。还有其他更优雅的方法来实现这一点。在实际的应用程序中,您可以将数据绑定到元素,并可以使用它来区分不同的圆。

太好了,这正是我想要的基础!“更优雅的方式”,他们会有相似的原则,还是完全不同?你有任何与此相关的链接或关键字吗?再次感谢……原则是一样的。请看一个更高级的例子。@Larskothoff这是一个干净而有用的例子,但我不明白为什么在这里使用g元素。为什么不直接使用圆圈来添加类等?因为这种方法意味着每个元素有一个组,这也就消除了组的整个点,不是吗?这里可能暗指最佳实践,但我看不出来。请您发表意见好吗?@sarikan您是对的,在这个特定的例子中,没有必要对组进行修改,您可以只使用圆圈。@Larskothoff非常感谢您的及时回复!