【发布时间】:2013-06-14 13:20:14
【问题描述】:
我已经定义了一些按预期工作的拖动行为(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”,即在我在“contextmenu”事件上调用e.preventDefault() 之后,有问题的节点会粘在我的鼠标指针上并跟随它,直到我再次(左)单击强制发布(我假设e.preventDefault() 也会导致“dragend”永远不会触发)。
我在thread on Google Groups 和discussion in d3's issues on Github 中找到了对此问题的简短讨论。但是,我无法从这些 cmets 中弄清楚如何防止这种行为。
如何才能在右键单击时不触发拖动?
【问题讨论】:
-
在
dragstart事件中,你可以检查鼠标右键是否被点击(使用d3.event),如果是,不调用force.stop()。 -
如何检查在
d3.event中单击了哪个鼠标按钮?我能找到的所有建议都像which、button和keyCode给我undefined。除此之外:我调用force.stop()在用户拖动时停止布局算法。所以不调用它不会阻止拖动手势的发生。 -
我认为
d3.event有一个成员sourceEvent或类似的东西,可以让您访问实际事件。是的,你还需要preventDefault()之类的东西。
标签: d3.js