Javascript d3树副本拖动节点

Javascript d3树副本拖动节点,javascript,d3.js,Javascript,D3.js,我想知道是否有办法改变以下树: 因此,当将节点拖放到新位置时,它会复制节点,而不是移动节点(最终只有在拖动之前/同时按住“shift”键时才会复制) 以下面的例子为例。将“级别2:A”拖动到“级别2:B”中。所需的输出现在将有两个“level2:A”分支。一个是在拖放之前当前处于页面加载状态,另一个是作为“Level 2:B”的子级,即副本 复制后所需的树: 我一直在寻找例子,但我似乎找不到任何能让我找到正确方向的例子 我认为复制节点是我在两个不同地方的工作 这里 .on("dragstar

我想知道是否有办法改变以下树:

因此,当将节点拖放到新位置时,它会复制节点,而不是移动节点(最终只有在拖动之前/同时按住“shift”键时才会复制)

以下面的例子为例。将“级别2:A”拖动到“级别2:B”中。所需的输出现在将有两个“level2:A”分支。一个是在拖放之前当前处于页面加载状态,另一个是作为“Level 2:B”的子级,即副本

复制后所需的树:

我一直在寻找例子,但我似乎找不到任何能让我找到正确方向的例子

我认为复制节点是我在两个不同地方的工作

这里

.on("dragstart", function(d) {
    var d = // copy node some how here maybe?
    if (d == root) {
或者在这里

function initiateDrag(d, domNode) {
    //draggingNode = d; // original
    var draggingNode = // copy node some how here maybe?
我使用的是d3v5,但早期版本中的任何示例都将非常有用。我真的只是在寻找任何类型的建议,不一定是一个功能性的例子,但显然这将是最好的


更新

在第一个答案的基础上,我得到了一些进一步的答案,但在按照预期工作之前,仍然需要解决一些悬而未决的问题。为了更好地显示我的问题,我更新了fiddle以使用d3v5,并在控制台中尽可能最好地显示任何问题

更新的小提琴

未决问题:

第1期

我需要制作一个节点及其所有子节点的副本,所以我决定尝试使用d3的函数。这是一个非常好的函数,非常接近我所希望的,但问题是该函数不复制折叠的节点。我怎样才能避开这件事

使用小提琴重新创建:

折叠“Level 2:A”并拖动到“Level 2:B”中。请注意,没有复制任何子项

第二期

使用node.copy()函数复制节点时,我想我遇到了对象引用问题。正如上面问题1中的node.copy()链接所述,“返回的深度副本共享相同的数据”。这会导致生成唯一节点ID的问题,因为如果更新节点的副本,它也会更新复制的原始节点,反之亦然。我怎样才能避开这件事

使用小提琴重新创建:


将“级别2:B”拖动到“顶级”中,然后单击“保存”按钮。请注意,发现了重复的ID。

由于d3绑定到数据,您应该使用被拖动节点的递归副本,因此在您的示例中,您应该将副本添加到目标节点,而不是从其父节点中删除节点(请参见第220-222行)。 请看一看-它有硬编码的子数组,但将“Level 2:a”拖动到“Level 2:B”中,效果与您描述的一样

  var copy = {
        name: draggingNode.name,
      children: [
            // todo copy children recursively
      ]
  }

非常感谢您的回答!这让我走得更远,但仍然有一些问题需要解决。请参阅上面的更新。