【发布时间】:2013-11-24 17:27:54
【问题描述】:
我无法成功区分使用 D3.js v3 绑定到两者的元素上的 click 事件和 drag 事件。下面代码中的圆圈被分配了一个拖动行为和一个click 监听器。
Demo here
var dragGroup = d3.behavior.drag()
.on('dragstart', function () {
console.log('Start Dragging Group');
})
.on('drag', function (d, i) {
d.x += d3.event.dx;
d.y += d3.event.dy;
d3.select(this).attr("transform", "translate(" + d.x + "," + d.y + ")");
});
var dragCircle = d3.behavior.drag()
.on('dragstart', function () {
d3.event.sourceEvent.stopPropagation();
d3.event.sourceEvent.preventDefault();
console.log('Start Dragging Circle');
})
.on('drag', function (d, i) {
d.cx += d3.event.dx;
d.cy += d3.event.dy;
d3.select(this).attr('cx', d.cx).attr('cy', d.cy);
});
var svg = d3.select('body').append('svg').attr('viewBox', '-50 -50 300 300');
var g = svg.selectAll('g').data([{
x: 10,
y: 10
}])
.enter().append('g').call(dragGroup);
g.append('rect').attr('width', 100).attr('height', 100);
g.selectAll('circle').data([{
cx: 90,
cy: 80
}]).enter()
.append('circle')
.attr('cx', function (d) {
return d.cx;
})
.attr('cy', function (d) {
return d.cy;
})
.attr('r', 30)
.call(dragCircle)
.on('click', function () {
console.log('clicked circle');
});
每当我单击示例中的圆圈时,我都会让控制台记录drag 事件以及click 事件。拖动时我也会遇到相同的行为,首先记录drag 事件,然后在mouseup 上记录click 事件。
分别处理这些事件的正确方法是什么?
用例是尝试在树布局中处理节点单击和节点拖放。
【问题讨论】:
-
你试过在
dragend上做preventDefault()等吗? -
@LarsKotthoff 是的,我有,也无济于事:(
-
你见过this question吗?
-
嗨 Lars,非常感谢您指出正确的方向。这是解决方案,如果你愿意,也许可以把它放在类似于@leMoisela 的答案中,这样我可以相信你?感谢您的所有帮助和关注。
-
@LarsKotthoff 感谢您让我朝着正确的方向前进!正在拉扯我的头发,试图找出如何在 d3 中捕获拖动事件
标签: javascript drag-and-drop d3.js