Я не могу успешно провести различие между событием click
и событием drag
для элемента, связанного с использованием D3.js v3. Кругу в приведенном ниже коде присваивается поведение перетаскивания, а также прослушиватель click
.
Демо здесь
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
.
Каков правильный способ обработки этих событий отдельно?
Вариант использования - попытка обработать node -click и node -drag/drop в макете дерева.