为什么在v2不执行的时候d3js v3在执行缩放时会破坏我的强制graphics?

我有一个使用d3.js创build的强制布局

我想同时具有可拖动力布局的正常function以及缩放能力。

我基本上从这个( http://jsfiddle.net/nrabinowitz/QMKm3/ )代码复制/粘贴缩放代码。 这与迈克·博斯托克(Mike Bostock)在这个例子中使用的缩放方法是一样的( http://bl.ocks.org/mbostock/3680957 )。

这是我的代码: http : //jsfiddle.net/kM4Hs/6/

正如我可以清楚地看到,缩放工作正常,但我无法在力布局中select单个节点,并拖动它们。

我已经发现,其他作者都使用d3.v2.js而不是我正在使用的新版本的d3.v3.js。 当我改变我的导入到V2,它完美的作品。 但是,为了进步和普遍良好的代码性,我想尽可能使用v3。

<script type='text/javascript' src='http://d3js.org/d3.v3.min.js'></script> versus <script type='text/javascript' src='http://d3js.org/d3.v2.min.js'></script> 

两个问题:为什么v3在v2没有时打破力布局,更重要的是,我能做些什么来解决这个问题?

提前致谢!

如果仔细阅读发行说明 ,则会看到对2.x(2.10.3)的最终版本和最新版本3.2.7之间所做的所有更改的完整说明。 特别是从版本3.2.2开始:

通过不阻止默认行为或停止传播,更好地处理d3.behavior.drag,d3.behavior.zoom和d3.svg.brush中的拖动手势。 例如,现在mousedown改变焦点,iframe外部的mouseup正常工作,touchstart不会结束。

因此,在V2​​中,通过停止在缩放事件上的传播,拖动行为可以优先于缩放行为。 在V3中,这不再自动发生,让您select哪个行为优先,什么时候select。

如果要在拖动节点时优先考虑拖动行为,则需要在拖动时停止对input事件的传播 ,以便这些事件不会被同时解释为缩放行为的平移。 在dragstart上停止传播已经足够了:

 var drag = d3.behavior.drag() .on("dragstart", function() { d3.event.sourceEvent.stopPropagation(); }) .on("drag", function() { /* handle drag event here */ }); 

如果使用强制布局,代码是:

 var drag = force.drag() .on("dragstart", function() { d3.event.sourceEvent.stopPropagation(); }); 

工作示例:

拖动和缩放

注意:结合这两种行为意味着手势的解释是模棱两可的,对位置高度敏感。 点击一个圆圈被解释为拖动该圆圈,而单击一个像素的点击可以被解释为平移背景。 结合这些行为的更强大的方法是采用模态。 例如,如果用户按住SPACE键,则无论点击位置如何,单击和拖动都被解释为平移,而不是拖动。 这种方法通常用于商业软件,如Adobe Photoshop。