javascript - 鼠标悬停时显示连接的节点显示交叉链接

标签 javascript events graph d3.js fade

我有一个强制导向图,其中节点鼠标悬停时,未连接到当前节点的元素会淡出,基于以下 example 。问题是,如果光标快速移动并且穿过不属于目标节点连接的链接,它仍然以完全不透明的方式显示,因为交叉链接鼠标悬停在途中被触发,但显然没有时间完成鼠标移出功能。例如你可以看到这个: fading problem

图中鼠标从上到下快速移动,光标停在HSA-MIR-424上。与目标节点的连接已正确显示,但还可见三个额外的链接,因为当光标穿过它们时会触发它们的鼠标悬停。如果我缓慢地重复从上到下的运动到同一个节点,或者从下到上移动到该节点,则不会出现这样的问题(因为在图中,没有在该方向上交叉的链接)。

如何避免这个问题?

相关部分代码,链接mouseover/mouseout:

    .on("mouseover", function(d) {
      var selection = d3.select(this);
      var initialWidth = Number( selection.style("stroke-width") );
      selection.transition().style("stroke-width", initialWidth + Number(4) )
      .style("stroke-opacity", 1.0);
      //.style("stroke", linkOverColor);
    } )
    .on("mouseout", function(d) {
      var selection = d3.select(this);
      selection.transition().style("stroke-width", getLinkStroke( selection.data()[0] ) )
      .style("stroke-opacity", conf.link_def_opacity);
    })

节点鼠标悬停/鼠标移出:

    // display closest neighbors and fade others out
    .on("mouseover", fade(0.10) )
    // return to default view
    .on("mouseout", fade(conf.node_def_opacity) );

淡入淡出功能:

    function fade(opacity) {
      return function(d) {

        d3.event.stopPropagation();

        var thisOpacity;

        // return to default view
        if( opacity === conf.node_def_opacity )
        {
          d3.selectAll('marker > path').transition().style("opacity", 1);
          nodeGroup.transition().style("opacity", conf.node_def_opacity);
          link.style("stroke-opacity", conf.link_def_opacity);
        }
        else // fade not-neighborhood away
        {
          d3.selectAll('marker > path').transition().style("opacity", 0);
          // d3.selectAll('marker > path').transition().style('display', 'none');
          nodeGroup.transition().style("opacity", function(o)
          {
            thisOpacity = isConnected(d, o) ? conf.node_def_opacity : opacity;
            return thisOpacity; 
          });

          link.style("stroke-opacity", function(o) {
            return o.source === d || o.target === d ? conf.link_def_opacity : opacity;
          });              
        }
      }
    }   

最佳答案

通过为节点和链接鼠标悬停操作引入计时器解决了这个问题。代码列于 answer .

关于javascript - 鼠标悬停时显示连接的节点显示交叉链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12509472/

相关文章:

javascript - 在页面加载时启动 Bootstrap 模式

python - 如何在没有 DFS/BFS 的情况下枚举哈密顿循环的可能重建?

javascript - JavaScript 中的控制台需要什么?

javascript - 广泛支持的正则表达式查看后面

javascript - 如何在ejs(javascriptmvc)中指定相对图像路径

javascript - 添加动态元素,并在单独的函数中设置它们的宽度/高度

javascript - onkeypress vs oninput 如何两全其美

c# - 快照将事件处理程序值作为 C# 中的方法参数

javascript - 如何根据新的情节更新 Highstock/Highcharts 中的当前 View ?

algorithm - B树的最小和最大高度