Я определил некоторое поведение перетаскивания, которое работает как ожидалось следующим образом (код в CoffeeScript):
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", вопрос node привязан к указателю мыши и следует за ним, пока я не сделаю другой (слева) щелчок чтобы заставить освобождение (я предполагаю, что e.preventDefault()
также вызывает "dragend", чтобы никогда не срабатывать).
Я нашел краткое обсуждение этой проблемы в потоке в группах Google и обсуждение проблем d3 в Github. Тем не менее, я не могу понять из этих комментариев, как предотвратить это поведение.
Как я могу не вызвать перетаскивание по правому клику?