Подтвердить что ты не робот

D3 События мыши - Click & DragEnd

В D3, если вы определили функцию перетаскивания следующим образом:

var drag = d3.behavior.drag()
        .on("drag", function () {alert("drag")})
        .on("dragend", function () {alert("dragEnd")});

Вы действительно не можете сделать следующее:

d3.select("#text1")
.on("click", function(d,i) {alert("clicked")})
.call(drag);

Причина в том, что щелчок будет запущен после того, как начнется "dragend". На мой взгляд, должно быть отдельное событие для нажатия, потому что я вижу огромную разницу между dragend и click.

Чтобы различать щелчок и конец события перетаскивания в элементе SVG, каково было бы решение?

4b9b3361

Ответ 1

В документации есть некоторые явные примеры для этого:

При регистрации вашего собственного прослушивателя кликов на элементах перетаскивания вы можете проверить, было ли событие нажатия нажато следующим образом:

selection.on("click", function() {
  if (d3.event.defaultPrevented) return; // click suppressed
  console.log("clicked!");
});

Это, наряду с примером stopPropagation() сразу после этого, позволяет вам контролировать, какие события запускаются и обрабатываются.

Чтобы быть ясным, дифференциация между концом перетаскивания и событием клика полностью зависит от вас. Самый простой способ сделать это - это, вероятно, установить флаг при перетаскивании и использовать этот флаг, чтобы определить, нужно ли обрабатывать событие dragend или click.

Ответ 2

Начиная с 4.9.0, существует .clickDistance(), с помощью которого вы можете контролировать, через какое расстояние перемещаться от места начала перетаскивания, вы не получите событие click.

Обратите внимание, что вы можете получить любое событие click, если вы удалите элемент из DOM до отпускания кнопки (например, с помощью .raise() в обработчике drag).