自定义 force.drag 会在悬停时丢失粘性节点
Customizing force.drag loses sticky nodes on hover
/
src/layout/force.js 中的 d3.js 源在自定义强制布局拖动时会提前返回:
force.drag = function() {
if (!drag) drag = d3.behavior.drag()
.origin(d3_identity)
.on("dragstart.force", d3_layout_forceDragstart)
.on("drag.force", dragmove)
.on("dragend.force", d3_layout_forceDragend);
if (!arguments.length) return drag;
this.on("mouseover.force", d3_layout_forceMouseover)
.on("mouseout.force", d3_layout_forceMouseout)
.call(drag);
};
它将在模拟运行时跳过粘性悬停代码。您可以在此演示 http://bl.ocks.org/mbostock/3750558 中看到它。当您让模拟四处移动并尝试通过将鼠标悬停在节点上来停止节点时,它们不再停止。
我有一个解决方法,我正在使用如下:
force.drag()
.on('dragstart', function(d) {
//...
})
.on('dragend', function(d) {
//...
}) ;
//...
node.call(force.drag);
此代码将首先调用 force.drag 的早期返回版本,以便您可以侦听事件,然后调用默认版本以获取额外的鼠标行为。第二个调用跳过拖动事件部分,因为它已经注册,这对这种情况出乎意料地好。
这是我想使用的代码,但您将在悬停功能上丢失粘性节点:
var drag = force.drag()
.on('dragstart', function(d) {
//...
})
.on('dragend', function(d) {
//...
}) ;
//...
node.call(drag);
我之所以没有只使用我自己的 d3.behavior.drag,是因为我想尽可能多地使用力布局的 d.fixed 处理。
有谁知道为什么当您要自定义拖动时代码会提前返回?我的解决方法对于将来的力阻力变化非常脆弱。不幸的是,将回归移至底部可能会破坏某些人的模拟。
force.drag
函数的后半部分通过建立侦听器将拖动行为附加到一组元素。当您在没有任何参数的情况下调用它时,这将不是一个选择,并且代码不会执行您的预期(并且很可能会给您带来错误)。因此,它会检查这一点,如果没有任何内容可以附加侦听器,则返回。
相关文章:
- 节点导出返回一个空对象
- 可以前端maven插件使用节点,npm已经安装
- 在jstree中,如何将指定的节点集中到大型树上
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- 如何从模块链中调用函数.导出到节点中
- 当鼠标悬停在文本中的单词上时显示警报
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- 每当您在选择器内移动鼠标时,悬停功能就会重复
- 如何在 D3 中创建工具提示,以便在图形中节点上的鼠标悬停上获取图像
- 如何在 Arbor js 中将鼠标悬停在节点上时显示节点的标签
- 如何通过按钮单击和鼠标悬停/鼠标退出显示和隐藏节点文本?D3/JS.
- jquery悬停未应用于子节点
- 鼠标悬停UL子节点不正确
- ExtJS TreeGrid's节点鼠标悬停事件
- 查找当前和上一个悬停节点
- 带子节点的鼠标悬停
- 在父节点悬停时更改img src
- 如何显示文本时,鼠标悬停在一个节点在D3强制布局
- 自定义 force.drag 会在悬停时丢失粘性节点
- 如何停用sigma-js节点悬停