Javascript 拖动D3节点时防止单击操作

Javascript 拖动D3节点时防止单击操作,javascript,d3.js,Javascript,D3.js,我可以单击D3节点以获得警报();消息我也可以拖动D3节点,但在释放鼠标时,拖动也会触发单击行为 是否有方法防止拖动节点后出现单击行为 这就是我称之为拖动的地方: var node = svg.selectAll(".node") .data(graph.nodes) .enter() .append("g") .attr("transform", function(d){return "translate("+d.x+","+d.y+")"}) .on("c

我可以单击D3节点以获得
警报();消息我也可以拖动D3节点,但在释放鼠标时,拖动也会触发单击行为

是否有方法防止拖动节点后出现单击行为

这就是我称之为拖动的地方:

var node = svg.selectAll(".node")
    .data(graph.nodes)
    .enter()
  .append("g")
    .attr("transform", function(d){return "translate("+d.x+","+d.y+")"})
    .on("click", function(d){
        if(d.user_id != "" && d.user_id != null){
            parent.parent.openUserProfile(d.user_id);
        }
    })
    .call(force.drag);
下面的一个答案建议添加类似于下面的代码,但我认为上面的代码也必须修改才能使它们协同工作

var drag = d3.behavior.drag();
drag.on("dragend", function() {
  d3.event.sourceEvent.stopPropagation(); // silence other listeners
});
正如秘书长提到的:

<> P>当将拖动行为与其他事件侦听器结合用于交互事件时,还可以考虑停止源事件上的传播以防止多个动作。


你试过e?(e,是点击事件)我所做的是涉及到另一个按钮按下,所以我可以点击并拖动,但要真正点击(选择)节点,我必须按下shift+鼠标左键来完成。我不知道你是否想看看,只是一个想法:)对于第二个问题,不要传递force.drag到call函数,像这样传递drag变量:。call(drag)我更新了上面的问题。我发布的第一块代码是否需要更改才能使用“var drag”?我对
d3
API不太了解,但我相信您现在可以使用
call(drag)
而不是
call(force.drag)
dragend
处理程序附加到drag,因此可以将其独立放置在
drag
的范围内。这有意义吗?我把这个标记为可接受的答案。非常感谢。我应该在我的问题中提到我的用例是力定向图。事实证明,它还有一个附加选项,列在下面:selection.on(“单击”,函数(d){if(d3.event.defaultPrevented)return;otherwisedawesomething();});
var drag = d3.behavior.drag();
selection.call(drag);

drag.on("dragend", function() {
  d3.event.sourceEvent.stopPropagation(); // silence other listeners
});