You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vis JS Edge:点击边时如何显示两端设备的端口标签

实现VisJS点击链路显示两端端口的方案

我之前做网络拓扑可视化的时候刚好遇到过这个需求,给你分享个亲测可行的解决方案,核心就是利用VisJS的事件监听和动态更新边标签的能力来实现:

  • 准备带端口信息的链路数据
    在定义每条edge的时候,给它加上自定义的端口属性,比如portFrom(源设备端口)和portTo(目标设备端口),初始标签留空:

    // 初始化节点数据(示例)
    const nodes = new vis.DataSet([
      { id: 'router1', label: 'Router 1' },
      { id: 'switch1', label: 'Switch 1' }
    ]);
    
    // 初始化链路数据,包含端口信息
    const edges = new vis.DataSet([
      { id: 1, from: 'router1', to: 'switch1', portFrom: '8', portTo: '15', label: '' },
      // 其他链路可以按同样格式添加
    ]);
    
  • 监听链路点击事件,动态更新标签
    给VisJS的network实例绑定click事件,当用户点击链路时,更新这条链路的label为你想要的端口显示格式:

    // 创建network实例(示例)
    const container = document.getElementById('network-container');
    const data = { nodes: nodes, edges: edges };
    const network = new vis.Network(container, data, {});
    
    // 监听点击事件
    network.on('click', function(params) {
      // 先清空所有链路的标签,确保每次只显示当前点击的链路端口
      edges.forEach(edge => {
        edges.update({ id: edge.id, label: '' });
      });
    
      // 判断是否点击了链路
      if (params.edges.length > 0) {
        const clickedEdgeId = params.edges[0];
        const targetEdge = edges.get(clickedEdgeId);
        // 拼接成你需要的端口显示格式
        const portLabel = `[${targetEdge.portFrom}] ---------------- [${targetEdge.portTo}]`;
        // 更新这条链路的标签
        edges.update({ id: clickedEdgeId, label: portLabel });
      }
    });
    
  • 优化标签显示样式(可选)
    可以通过配置options来调整标签的外观,让它更清晰易读:

    const options = {
      edges: {
        label: {
          fontSize: 12,
          align: 'middle',
          // 给标签加白色背景,避免和链路线条重叠
          background: {
            color: '#ffffff',
            padding: 4,
            cornerRadius: 2
          }
        },
        width: 2,
        color: { inherit: 'both' }
      }
    };
    
    // 重新初始化network时传入options
    const network = new vis.Network(container, data, options);
    
  • 额外优化:点击空白处隐藏端口标签(可选)
    如果希望点击拓扑图空白区域时清空所有端口标签,可以在点击事件里补充判断:

    network.on('click', function(params) {
      // 点击空白处(未选中节点或链路)
      if (params.nodes.length === 0 && params.edges.length === 0) {
        edges.forEach(edge => {
          edges.update({ id: edge.id, label: '' });
        });
        return;
      }
    
      // 下面是之前的点击链路逻辑...
    });
    

这个方案的优势是逻辑简单,完全基于VisJS原生API实现,不需要额外依赖,而且可以灵活调整显示格式和样式。

内容的提问来源于stack exchange,提问作者BeeBee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:56:53