【问题标题】:d3.js : Differentiate between drag/start/end and click eventd3.js:区分拖动/开始/结束和点击事件
【发布时间】:2016-05-30 20:40:19
【问题描述】:

正如标题所说,我有一个对象,我需要它的所有拖动和单击事件。有some discussion关于这个问题,但它主要涉及点击和拖动事件。 (并且回复小提琴没有正常工作)

我在这里有一个fiddle。当我拖动时,会阻止单击,但是当我单击 dragstart 和 end 事件时会触发。我希望它们在我单击时不触发,并且我希望在我想要拖动时单击不触发。

var drag = d3.behavior.drag()
  .origin(function(d){return d})
  .on('drag', function(d){
   d3.select(this).attr('cx', function(d){ return d.x += d3.event.dx });
   d3.select(this).attr('cy', function(d){ return d.y += d3.event.dy });   
   console.log('dragging');
})
.on('dragstart', function(d){
  d3.event.sourceEvent.stopPropagation()
  console.log('drag start');
})
.on('dragend', function(d){
  console.log('drag end');
})

// ..... 

 MySvgElementWith3DStuffOnIt.on('click', function(){
  if(d3.event.defaultPrevented) return;
  console.log('clicked');
});

【问题讨论】:

  • 网上有很多例子。我想找一个

标签: javascript d3.js


【解决方案1】:

@thatOneGuy 的小更新以使用 d3v4 拖动模块

https://jsfiddle.net/mhebrard/q5eL5qyv/

var drag = d3.drag()
    .on('drag', function(d){
    d3.select(this).attr('cx', function(d){ return d.x += d3.event.dx });
    d3.select(this).attr('cy', function(d){ return d.y += d3.event.dy });   
    console.log('dragging');
  })
  .on('start', function(d){
    console.log('drag start');
  })
  .on('end', function(d){
    console.log('drag end');
  })

【讨论】:

  • 当我运行这个例子并点击圆圈时,我仍然得到所有三个拖动事件:拖动开始、拖动和拖动结束。运行 Chrome 64
【解决方案2】:

您的示例按预期工作。查看更新的小提琴:https://jsfiddle.net/thatOneGuy/dd4nujxo/1/

我添加了一些控制台日志。当你拖动这条线时:

if (d3.event.defaultPrevented) {console.log('return'); return};

将阻止点击事件触发。当您只单击时,dragstartdragend 会被触发(如预期的那样),但drag 不会。这就是为什么您将代码移动到drag 函数内的原因。整个事情按预期工作:)

【讨论】:

  • 所以我不能在不触发 dragstart 和 dragend 的情况下点击?
  • 我不这么认为,这会是什么问题?
  • 我正在编写一个协作图形应用程序,当您单击节点时,它会添加一个新节点,当您拖动它时会将其与其他节点锁定,当您开始拖动时也会显示一个网格.当我单击节点并且网格闪烁时,它看起来很烦人。是的,没有什么惊天动地的,但它仍然是。
  • 只需将此代码放在拖动中而不是拖动开始?
  • 必须这样做。不会是最花哨的解决方案,但它会起作用。
猜你喜欢
  • 2016-02-10
  • 1970-01-01
  • 2014-03-12
  • 2019-11-17
  • 2012-12-11
  • 2014-05-04
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
相关资源
最近更新 更多