在 cytoscape 中显示和隐藏鼠标悬停的节点信息

Show and hide node info on mouseover in cytoscape

我正在浏览器中处理 cytoscape.js 图表。当鼠标悬停在细胞景观图中的节点上时,我想显示一些节点信息(例如节点标签)。以下代码适用于 console.log(),但我想在浏览器中显示信息:

cy.on('mouseover', 'node', function(evt){
    var node = evt.target;
    console.log( 'mouse on node' + node.data('label') );
});

请帮忙!

Cytoscape.js 有 popper.js 小费。我可以给你一个 popper.js:

的工作示例

popper 与 tippy:

document.addEventListener("DOMContentLoaded", function() {
  var cy = (window.cy = cytoscape({
    container: document.getElementById("cy"),
    style: [{
        selector: "node",
        style: {
          content: "data(id)"
        }
      },
      {
        selector: "edge",
        style: {
          "curve-style": "bezier",
          "target-arrow-shape": "triangle"
        }
      }
    ],
    elements: {
      nodes: [{
        data: {
          id: "a"
        }
      }, {
        data: {
          id: "b"
        }
      }],
      edges: [{
        data: {
          id: "ab",
          source: "a",
          target: "b"
        }
      }]
    },
    layout: {
      name: "grid"
    }
  }));

  function makePopper(ele) {
    let ref = ele.popperRef(); // used only for positioning

    ele.tippy = tippy(ref, { // tippy options:
      content: () => {
        let content = document.createElement('div');

        content.innerHTML = ele.id();

        return content;
      },
      trigger: 'manual' // probably want manual mode
    });
  }

  cy.ready(function() {
    cy.elements().forEach(function(ele) {
      makePopper(ele);
    });
  });

  cy.elements().unbind('mouseover');
  cy.elements().bind('mouseover', (event) => event.target.tippy.show());

  cy.elements().unbind('mouseout');
  cy.elements().bind('mouseout', (event) => event.target.tippy.hide());

});
body {
  font-family: helvetica neue, helvetica, liberation sans, arial, sans-serif;
  font-size: 14px
}

#cy {
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  right: 0;
  z-index: 1;
}

h1 {
  opacity: 0.5;
  font-size: 1em;
  font-weight: bold;
}
<head>
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1">
  <script src="https://unpkg.com/cytoscape/dist/cytoscape.min.js"></script>
  <script src="https://unpkg.com/popper.js@1.14.7/dist/umd/popper.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/cytoscape-popper@1.0.4/cytoscape-popper.min.js"></script>
  <script src="https://unpkg.com/tippy.js@4.0.1/umd/index.all.min.js"></script>
  <link rel="stylesheet" href="https://unpkg.com/tippy.js@4.0.1/index.css" />
</head>

<body>
  <div id="cy"></div>
</body>

大家好,Stephan 的回答无法像 React.js 那样使用基于模块的代码,所以我给你一个没有 tippy 的替代方案

popper.css // 波普风格

.popper-div { // fill free to modify as you prefer
  position: relative;
  background-color: #333;
  color: #fff;
  border-radius: 4px;
  font-size: 14px;
  line-height: 1.4;
  outline: 0;
  padding: 5px 9px;
}

App.js

import cytoscape from "cytoscape";
import popper from "cytoscape-popper"; // you have to install it

import "./popper.css";

cytoscape.use(popper);

const cy = cytoscape({....});

cy.elements().unbind("mouseover");
cy.elements().bind("mouseover", (event) => {
  event.target.popperRefObj = event.target.popper({
    content: () => {
      let content = document.createElement("div");

      content.classList.add("popper-div");

      content.innerHTML = event.target.id();

      document.body.appendChild(content);
      return content;
    },
  });
});

cy.elements().unbind("mouseout");
cy.elements().bind("mouseout", (event) => {
  if (event.target.popper) {
    event.target.popperRefObj.state.elements.popper.remove();
    event.target.popperRefObj.destroy();
  }
});