Javascript 即使dx和dy为0,d3拖动也会触发事件

Javascript 即使dx和dy为0,d3拖动也会触发事件,javascript,d3.js,Javascript,D3.js,当我尝试创建一个新的d3.drag()函数并将其绑定到我的选择时,即使单击时没有移动鼠标(dx和dy=0),也会触发“拖动”事件。 我不想在没有“拖动”的情况下调用单击处理程序 我希望clicked=true,当我在单击时不移动鼠标时,“拖动”不会触发。现在单击是正确的,但“拖动”也会被触发。在我的评论上再添加一点:a,因此您不能真正阻止调用回调。根据定义,这意味着dragstart总是在注册click事件之前触发,这就是为什么不能阻止dragstart在click调用的事件处理程序中触发。单击

当我尝试创建一个新的
d3.drag()
函数并将其绑定到我的选择时,即使单击时没有移动鼠标(dx和dy=0),也会触发“拖动”事件。 我不想在没有“拖动”的情况下调用单击处理程序


我希望clicked=true,当我在单击时不移动鼠标时,“拖动”不会触发。现在单击是正确的,但“拖动”也会被触发。

在我的评论上再添加一点:a,因此您不能真正阻止调用回调。根据定义,这意味着
dragstart
总是在注册
click
事件之前触发,这就是为什么不能阻止dragstart在click调用的事件处理程序中触发。单击并释放元素时发生的事件链:

  • 触发
    mousedown
    事件:这将触发d3.js中的
    dragstart
    事件
  • 触发
    mouseup
    事件:这将触发d3.js中的
    dragend
    事件
  • 将触发
    单击
    事件
  • 单击
    mousedown
    mouseup
    事件按顺序触发后触发

    这也意味着即使没有光标/指针/鼠标移动,
    dragstart
    事件也将始终触发,因为在该时间点,当触发
    mousedown
    事件时,浏览器不知道是否检测到任何移动


    但是,您可以做的是设置某种类型的保护子句,如果事件寄存器的
    dx
    dy
    为零,则该子句不允许在回调中进一步执行逻辑。

    就是这样的:一个
    mousedown
    事件将触发dragstart事件,如所示。为了避免这种情况,当dx或dy为非零时,即通过一个guard子句或类似的方法调用处理程序@特里,你是说在“拖”比赛中的一名后卫尝试过这种方法,效果很好。我认为“拖动”事件应该只在鼠标移动时触发…@MrDeibl请参阅我的更新答案,解释为什么我们不能选择在没有mousemove事件的情况下不触发拖动事件:这是因为mousedown是在任何移动注册之前触发的,因此在这一点上,我们不知道鼠标是否已移动。
    var drag = d3.drag()
            .on('start', dragStart)
            .on('drag', dragging)
            .on('end', dragEnd);
    
    viewPort.on('click', function () {
            clicked = true;
            })
            .call(drag);