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

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

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

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

这是我不明白的代码:

function dragged(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,代码开始执行我所期望的。

function dragged(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 源代码。

最佳答案

我认为奇怪的行为是预期的行为。

所有 DragEvent 对象都有一个“主题”。主题不是产生拖动事件的 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;

关于javascript - D3 拖动事件行为 : DragEvent. x 和 DragEvent.y 值来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42844949/

相关文章:

javascript - jQuery/Javascript 鼠标点击时的力/压力

javascript - 缩放导致图形超出绘图区域范围

html - 响应式 svg : add inline style to `<svg>` -element

javascript - 如何使用 Keycloak 获取当前用户头像?

javascript - 通过 .animate() 和 .css() 设置宽度之间的差异

javascript - 将多个 D3 圆排列成圆弧或半圆图案

javascript - 在 D3 中思考 - 选择与追加

svg - d3js - 需要找到 g 元素的全尺寸

html - 如何根据不同颜色的百分比填充SVG路径

javascript - 我的邮寄路线有问题吗?