在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源代码。
答案 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;