d3.js - 可能的 d3 错误 : dragend fires without any drag event

标签 d3.js dom svg drag-and-drop dom-events

我正在使用 d3js 拖动行为。这是 demo .当我点击元素时,“拖动”和“拖动”事件被触发。即使我不尝试拖动它们,事件仍然会触发。我想在单击项目时调用其他一些函数。只有在拖动项目时才应触发拖动事件。那么如何在这里分离出拖动事件和点击事件。

function onDragDrop(dragHandler, dropHandler) {
    var drag = d3.behavior.drag();

drag.on("drag", dragHandler)
.on("dragend", dropHandler);
return drag;
}

  var d = [{ x: 20, y: 20 }];

    var g = d3.select("body").select("svg").data(d).append("g").attr("transform", function (d) { return        "translate(" + d.x + "," + d.y + ")"; })
     .call(onDragDrop(dragmove, dropHandler));

g.append("rect")
.attr("width", 40)
.attr("height", 40)
.attr("stroke", "red")
.attr("fill","transparent")
.attr("x", "20" )
.attr("y", "20")

g.append("text")
.text("Any Text")
.attr("x", "20" )
.attr("y", "20")

function dropHandler(d) {
    alert('dropped');
}

function dragmove(d) {
  alert('dragged');
  d.x += d3.event.dx;
  d.y += d3.event.dy;
  d3.select(this).attr("transform", "translate(" + d.x + "," + d.y + ")");
 }

最佳答案

编辑 3

这是对您的备选答案帖子的回应。您在那里发布的 fiddle 并不能准确反射(reflect)我试图描述的解决方案。我更新了它。下面的 fiddle 应该是区分点击和“真实”拖动事件的正确方法的示例。请注意,我们没有使用“点击”处理程序。

http://jsfiddle.net/V92CF/

编辑2

好的,我在 d3 google 组上发布了这个问题,并得到了 Jason Davies 的回答。我们看到的行为是预期的行为,不是错误。 “点击”被简单地认为是一个微不足道的(移动了 0 个像素)拖动,但它仍然是一个拖动。 d3 的创建者 Mike 解释了这里的原因:

https://github.com/mbostock/d3/pull/368

因此,您的问题的正确解决方案是我之前描述为 hack 的解决方案:您需要检测是否确实在 dragend 处理程序内部进行了移动,然后仅在有移动时才触发您的逻辑。

编辑

请注意我下面的原始答案是错误的。我误解了这个问题。下面的评论和我对 OP 的编辑应该澄清

下方为原帖

这里唯一的问题是使用 alert。我将所有 alert 更改为 console.log,它工作正常:

http://jsfiddle.net/TrWw3/

我认为它与警报混淆了,因为一旦您开始拖动,它就会触发警报框,这需要您将其关闭。但是当你关闭它时,鼠标已经跳动了,而且这个过程中的某些东西把事情搞砸了。

无论如何,打开 chrome 或 firefox js 控制台的 console.log 会很好地修复你。

关于d3.js - 可能的 d3 错误 : dragend fires without any drag event,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16056833/

相关文章:

html - D3.js 与 Bootstrap 冲突

javascript - 触发浏览器事件进行测试

java - 如何在没有标签的情况下选择 HTML 标签中的文本(JSoup)

java - 使用 Batik 的文本元素的边界框值错误

javascript - SVG渐变 "Pie Slice"

javascript - d3js 强制布局为每个节点动态添加图像或圆圈

javascript - SVG/HTML 5 Canvas - 圆形图案位移,stripe.com 方法

javascript - 将分类数据的配色方案与线性范围相结合

PHP:错误检查中的错误

javascript - Page Up/Down 事件上的动画滚动