javascript - 单击时显示边 ID

标签 javascript cytoscape.js

我在这里尝试使用 cytoscape.js 库实现的目标是,当我单击一条边时,将显示该边的 ID 而不是悬停。

例如,只有当我点击边缘时,ab id 才会显示。我不想在单击时显示节点的 ID。

提前感谢您的帮助。

有没有比 cytoscape.js 包含更多示例的文档?

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>

最佳答案

这是基本的 cytoscape.js 功能。您正在使用这两行作为事件触发器:

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());

如果你看一下代码,你会注意到两件事:

简单的修复是这样的:

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

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


cy.edges().unbind('mousedown');
cy.edges().bind('mousedown ', (event) => event.target.tippy.show());

cy.edges().unbind('mouseup');
cy.edges().bind('mouseup', (event) => event.target.tippy.hide());

在您的代码中,这看起来像这样:

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.nodes().unbind('mouseover');
  cy.nodes().bind('mouseover', (event) => event.target.tippy.show());

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


  cy.edges().unbind('mousedown');
  cy.edges().bind('mousedown', (event) => event.target.tippy.show());

  cy.edges().unbind('mouseup');
  cy.edges().bind('mouseup', (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>

关于javascript - 单击时显示边 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62063700/

相关文章:

cytoscape.js 如何在平移时去除灰色圆圈

qtip2 - 实现 cytoscape.js-qtip 的难点

javascript - Firebase 中数据对象的数字排序 ID

javascript - 尝试使用 firebase 支持的 Web 登录页面登录,然后重定向到主页

javascript - 键盘快捷键扩展中的触发事件

layout - 如何改善 cytoscape.js 中 'cose' 布局的间距?

javascript - 使用 while 循环迭代遍历图

javascript - Cytsocape.js 无法创建目标不存在的边缘

javascript - javascript 中复选框的 oncheck 监听器

javascript - 如何从特定元素中获取值(value)?