я определил некоторое поведение сопротивления, которое работает, как ожидается, следующим образом (код в CoffeeScript):Как предотвратить d3 от запуска перетаскивания по правому клику?
nodeDrag = d3.behavior.drag()
.on("dragstart", (d, i) ->
force.stop())
.on("drag", (d, i) ->
d.px += d3.event.dx
d.py += d3.event.dy
d.x += d3.event.dx
d.y += d3.event.dy
tick())
.on("dragend", (d, i) ->
force.resume()
d.fixed = true
tick())
// ...
nodes = vis.selectAll(".node")
.data(graph.nodes)
.enter()
.append("g")
// ...
.call(nodeDrag)
теперь я пытаюсь создать пользовательские поведения для щелчка правой кнопки на узлах. Однако это вызывает «dragstart» и «drag», т. Е. После того, как я вызываю e.preventDefault()
в событии «contextmenu», данный узел привязан к указателю мыши и следует за ним, пока я не сделаю другой (слева) щелчок, чтобы принудительно освободить (Я предполагаю, что e.preventDefault()
также вызывает «dragend», чтобы никогда не срабатывать).
Я нашел краткое обсуждение этой проблемы в thread on Google Groups и discussion in d3's issues on Github. Тем не менее, я не могу понять из этих комментариев, как предотвратить это поведение.
Как я могу не вызвать перетаскивание по правому клику?
В событии 'dragstart' вы можете проверить, была ли нажата правая кнопка мыши (с помощью d3.событие), и если да, не вызывайте 'force.stop()'. –
Как проверить, какая кнопка мыши была нажата в 'd3.event'? Все предложения, которые я могу найти как 'which',' button' и 'keyCode', дают мне' undefined'. Кроме того: я вызываю 'force.stop()', чтобы остановить алгоритм компоновки во время перетаскивания пользователем. Поэтому, не вызывая этого, это не будет препятствовать тому, чтобы перетащить жест. – notan3xit
Я думаю, что 'd3.event' имеет член' sourceEvent' или что-то вроде того, что дает вам доступ к реальному событию. И да, вам понадобится нечто вроде 'preventDefault()'. –