【问题标题】:d3 mousedown event fires, but mouseup event does not fired3 mousedown 事件触发,但 mouseup 事件不触发
【发布时间】:2018-04-13 02:19:11
【问题描述】:

我在 d3 中看到了一些奇怪的行为。我以通常的方式有一个力有向图

node = svg.selectAll(".node").data(graph.nodes).enter().append("circle")....

当有人点击一个节点时,我想要一个简单的动画(而不是 console.log)

function set_focus(d) { console.log('set'); }
function remove_focus() { console.log('remove'); }

node.on("mousedown", set_focus);
node.on("mouseup", remove_focus);

有趣的是,当我在节点上按下鼠标时,set 事件会触发,但是当我释放鼠标时,remove_focus 不会触发。有人知道发生了什么吗?


d3v5、chrome 65、macOS 10.13

【问题讨论】:

标签: d3.js


【解决方案1】:

tldr:缩放事件与您的 mouseup 事件冲突。

我创建了一个 fork,因为我不太确定您要对此做什么,而且我不想弄乱您的 git 历史记录:this link is the fork

单击鼠标后,您在 SVG 上的 Zoom 事件似乎正在“消耗”所有其他事件。我的印象是,这是一个已知且普遍抱怨的问题。我认为这个GitHub ticket 是相关的,this one 也是如此。每迈克博斯托克,

这是预期的行为。根据发行说明:“变焦 行为现在消耗已处理的事件。”所以,如果 mouseup 事件是一部分 的缩放手势,然后缩放行为停止立即 该 mouseup 事件的传播阻止其他侦听器 接收它(并在可能的情况下阻止关联的浏览器 默认行为)。这使得结合缩放和 如本例所示拖动:

http://bl.ocks.org/mbostock/3127661b6f13f9316be745e77fdfb084

如果您想阻止缩放手势启动,请使用 zoom.filter 忽略某些事件,或使用 event.stopPropagation 或 event.stopImmediatePropagation 以防止缩放行为 接收启动事件。如果你想在之后做某事 缩放手势,监听缩放事件。

我可以通过删除d3.zoom 事件或在set_focus 函数中调用d3.event.stopPropagation 来触发您的mouseup 事件。因此,下面的两行(以及在 fork 中)让您的 remove_focus 函数触发,但我不确定我是否也搞砸了您希望缩放事件如何工作:

function set_focus(d) {
    console.log('set');
    d3.event.stopPropagation();
    node.style("opacity", function(o) { return (d == o || o.layer == d.layer - 1) ? 1 : 0.1; });
    link.style("opacity", function(o) { return (o.target == d.id) ? 1 : 0.02; });
}

function remove_focus() {
    console.log('remove');
    d3.event.stopPropagation();
    node.style("opacity", 1);
    link.style("opacity", function () { return edgeOpacity; })
}

【讨论】:

  • !感谢您深入了解这一点。出于好奇,你是怎么想出来的?我真的需要升级我的 javascript 调试。您的修复工作有效,我在问题中添加了赏金以感谢您!
  • 谢谢!我只是想出了一些可能导致问题的想法,并尝试测试每一个。我猜是:1)事件没有附加到每个节点 2)某些东西被放置在 DOM 中的节点顶部,因此无法检测到该事件或 3)另一个事件正在干扰它。有一次,我从代码中的每个事件中记录了一些东西,这样我就可以看到什么触发了,什么没有触发。我注意到当我单击并按住鼠标时,缩放事件会反复触发。我注释掉了那段代码,mouseup 事件起作用了。
【解决方案2】:

现在你有一个缩放事件结束的监听器see here

所以你可以做类似的事情

d3.zoom().on('end', remove_focus)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2011-02-20
    • 2016-05-30
    • 2016-12-09
    相关资源
    最近更新 更多