我对拖动在D3中的工作方式非常熟悉。但是我发现了最近使我震惊的东西。
遵循代码以创建有效的图形,我无法按照代码处理拖动节点:
function dragstarted(d) {
if (!d3.event.active) simulation.alphaTarget(0.3).restart();
d.fx = d.x;
d.fy = d.y;
}
function dragged(d) {
d.fx = d3.event.x;
d.fy = d3.event.y;
}
function dragended(d) {
if (!d3.event.active) simulation.alphaTarget(0);
d.fx = null;
d.fy = null;
}
知道为什么我们在拖动和拖动中检查此处的if语句?
我尝试删除if条件,但并没有真正看到针对的力图有太大的区别。也就是说,而不是
if (!d3.event.active) simulation.alphaTarget(0.3).restart();
我放
simulation.alphaTarget(0.3).restart();
,没有太大的区别。
active
属性在此处描述。它表明当前正在进行的事件发生了多少拖放事件,除了目前正在射击的事件外,仅与多点触摸场景真正相关。之所以使用此检查是为了保持模拟至少发生一个主动阻力。
例如,如果没有发生主动拖动,并且您开始拖动,则在dragstarted
d3.event.active
中为0,并且力模拟将启动。如果d3.event.active !== 0
,则已经发生了阻力,并且已经进行了模拟。
同样,在dragended
中,如果d3.event.active !== 0
,则仍会发生另一个阻力,我们不想停止模拟。如果d3.event.active === 0
,则是最后一个阻力,我们想停止模拟。
(这回答了OP的第一个问题,而不是有关if
条件的新问题)
我尝试将其删除,但并没有真正看到针对力图的区别。
你不是吗?差异很大,非常明显。
在dragstarted
中没有这条线:
if (!d3.event.active) simulation.alphaTarget(0.3).restart();
当您拖动节点时,仿真不会重新启动。我做了一个复制Bostock的代码并仅删除该行的Bl.ock。等到力停止(大约5秒),然后尝试拖动节点:
https://bl.ocks.org/anonymous/7ad316f78d18233c1408d27c8ff58e0e
你看到了吗?你不能!
,对于dragended
中的这一行:
if (!d3.event.active) simulation.alphaTarget(0);
没有它,模拟就永远不会停止,在您停止拖动节点后,它会永远慢慢移动。我做了另一个Bl.ocks复制Bostock的代码并仅删除该行,请尝试:
https://bl.ocks.org/anonymous/6efa5edf188b3c87b7adbc877672b725