为什么当v2不执行缩放时,d3.js v3打破我的力图? [英] Why does d3.js v3 break my force graph when implementing zooming when v2 doesn't?

查看:294
本文介绍了为什么当v2不执行缩放时,d3.js v3打破我的力图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个强制的布局,我已经使用d3.js创建



我想有一个可拖动力布局的正常功能,



我基本上是从这里复制/粘贴缩放代码(



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


I have a force layout that I have created using d3.js

I would like to have both the normal functionality of a draggable force layout as well as the ability to zoom.

I have basically copy/pasted the zooming code from this (http://jsfiddle.net/nrabinowitz/QMKm3/) code. This is the same way of zooming that Mike Bostock uses in this (http://bl.ocks.org/mbostock/3680957) example.

Here is my code: http://jsfiddle.net/kM4Hs/6/

As can be clearly seen in mine, the zooming works fine, but I am unable to select single nodes in the force layout and drag them around.

I have found the culpret to be the fact that both the other authors use d3.v2.js rather than the newer d3.v3.js which I am using. When I change my import to v2 it works perfectly. However, in the interest of progress and just general good codeness, I would like to use v3 if possible.

<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>

Two questions: why does v3 break the force layout when v2 doesn't, and, more importantly, what can I do, if anything, to fix it?

Thanks in advance!

解决方案

If you peruse the release notes, you’ll see a full explanation of everything that’s changed between the final release of 2.x (2.10.3) and the most recent release, 3.2.7. In particular, from release 3.2.2:

Better handling of drag gestures in d3.behavior.drag, d3.behavior.zoom and d3.svg.brush by not preventing default behaviors or stopping propagation. For example, mousedown now changes focus, mouseup outside an iframe works correctly, and touchstart does not stutter.

So, in V2, the drag behavior could take priority over the zoom behavior by stopping propagation on zoom events. In V3, this no longer happens automatically, giving you the choice of which behavior takes priority, and when.

If you want to give the drag behavior priority when dragging nodes, then you need to stopPropagation on input events while dragging so that these events are not simultaneously interpreted as panning by the zoom behavior. Stopping propagation on dragstart is sufficient:

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

If using a force layout, the code is:

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

Working example:

Note: combining these two behaviors means that gesture interpretation is ambiguous and highly sensitive to position. A click on a circle is interpreted as dragging that circle, whereas a click one pixel away could be interpreted as panning the background. A more robust method of combining these behaviors is to employ modality. For example, if the user holds down the SPACE key, clicking and dragging is interpreted as panning, rather than dragging, regardless of the click location. This approach is commonly employed in commercial software such as Adobe Photoshop.

这篇关于为什么当v2不执行缩放时,d3.js v3打破我的力图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆