即使鼠标不移动,D3'Drag'事件也会触发

问题描述 投票:1回答:3

我注意到,当我使用d3.drag().on('drag',...)时,即使没有移动鼠标也会触发。使用下面的代码片段(我从this question中提取),如果我只是单击并释放,我仍然在控制台中看到drag event 1

这是一个问题,因为我希望能够区分dblclick和拖拽。我看过this postthis one,但一直无法使这些解决方案起作用(可能是因为那些是旧的答案而我正在使用D3 v4)。我注意到在fiddleone of the answers中,它显示了同样的问题:点击事件和拖动事件。

我认为drag事件只会在鼠标移动时触发,然后我可以用它来设置一个标记,将其标记为拖动,而不是双击。但是,如果在鼠标按下时触发拖动,则此功能无效。

非常愿意接受关于这一点的建议,以及解释为什么drag以这种方式行事。我意识到这取决于浏览器,因此我运行的是Chrome 64。

var count = 0;
d3.select("svg").call(d3.drag().on("start", function() {
  console.log("drag started")
}).on("drag", function() {
  ++count; 
  console.log("drag event " + count)
}).on("end", function() {
  count = 0;
  console.log("drag ended")
}))
.as-console-wrapper { max-height: 20% !important;}
svg {
  border: 1px solid black;
}
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg></svg>
javascript d3.js drag-and-drop drag mousemove
3个回答
0
投票

我确实提出了以下解决问题的工作。基本上只需保存拖动start上的鼠标位置,然后检查鼠标是否已移动拖动drag

虽然这有效,但我有点认为drag已经在做这样的事情了,或者那里会有更清洁的解决方案。很想知道某人是否有更好的东西!

var count = 0;
var dragStartPos = {};

d3.select("svg").call(d3.drag().on("start", function() {
  console.log("drag started")
  dragStartPos.x = d3.event.x;
  dragStartPos.y = d3.event.y;
}).on("drag", function() {
  if(d3.event.x != dragStartPos.x ||
    	d3.event.y != dragStartPos.y) {
      ++count; 
      console.log("drag event " + count)
  }
}).on("end", function() {
  count = 0;
  console.log("drag ended")
}))
.as-console-wrapper { max-height: 20% !important;}
svg {
  border: 1px solid black;
}
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg></svg>

0
投票

所以d3.drag有一个你可以打电话的clickDistance()功能。这允许在触发拖动事件之前在mousedownmouseup之间容差,并且可能正是您正在寻找的。

const drag = d3.drag()
               .clickDistance(10)
               .on("start", () => { console.log("drag started"); })
               .on("drag", () => { console.log(`moved by ${d3.event.dx},${d3.event.dy}`); });

通常这是因为你实际上是在mousedownmouseup之间略微移动鼠标,但只是非常轻微。我今天一直在看类似的事情,可能大概有25%的时间我不小心移动鼠标(使用触摸问题变得更糟)。

还要注意,因为你没有真正提到它,但存在一个你可以订阅的dblclick事件。请注意,使用dblclick时的事件顺序如下所示(单击未被抑制):

  • 点击
  • 点击
  • DBLCLICK

0
投票

对不起,这是一个答案,我还没有足够的代表发表评论。

我没有看到d3.drag().on('drag',...)在没有移动鼠标的情况下被解雇。我在mousedown上获得了一个start事件,而mousep上的end事件和drag事件仅在实际拖动时触发。这是我迄今为止尝试过的所有浏览器的行为(Chrome 63,FF 58,IE11)。这似乎与d3.drag API Reference一致

© www.soinside.com 2019 - 2024. All rights reserved.