D3拖动事件行为:DragEvent.x和DragEvent.y值源

时间:2017-03-16 21:18:03

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

在Mike Bostock的D3示例中,我不了解D3 DragEvent对象的行为。

这些是我不明白的两个例子: Circle Dragging I Drag + Zoom

这是我不理解的代码:

  

函数被拖动(d){d3.select(this).attr(" cx",d.x =   d3.event.x)。attr(" cy",d.y = d3.event.y); }

在此示例中,d.x和d.y是包含圆的最后一个中心的数据对象的一部分。

我期望在这段代码中发生的是,圆圈的属性cx和cy变为d3.event.x和d3.event.y的当前值

在我看来,这应该是用户开始拖动时鼠标所在的坐标。如果用户没有开始准确地拖动圆圈的中心,我期望的行为是跳到用户开始拖动的位置的圆圈,然后是正常的拖动行为。

我的问题是最初的跳跃并没有发生,我也不知道为什么。

我在代码运行时检查了d3.event.x和d3.event.y的值,它们与d.x和d.y的值完全相同,不记得用户在圈子中点击的位置。我不明白为什么会这样。

最后,我更改了对象中的名称(并且只是名称)(在代码中必要时),从d.x和d.y到d.m和d.n,代码开始执行我期望的操作。

  

函数被拖动(d){d3.select(this).attr(" cx",d.m =   d3.event.x)。attr(" cy",d.n = d3.event.y); }

因此,当数据对象具有属性d.x和d.y时,当数据对象具有属性d.m和d.n时,代码的工作方式不同。 看起来DragEvent这个对象期望一个具有特定属性的数据对象,但这对我来说听起来很奇怪,我无法找到它。

如果有人知道答案,我本来希望避免检查D3源代码。

1 个答案:

答案 0 :(得分:1)

我虽然奇怪的行为是预期的行为。

所有DragEvent对象都有一个'subject'。主题不是产生拖动事件的SVG形状,但是,如果存在,则与该SVG关联的数据。

更多信息请参阅:https://github.com/d3/d3-drag#drag_subject

所以,是的,如果基准对象具有属性x和y,则该值将分配给DragEvent对象的属性dx和dy。

正如我们在d3源代码中看到的那样,在drag.js文件中:

  dx = s.x - p[0] || 0;
  dy = s.y - p[1] || 0;