【问题标题】:Multiple node selection in vis.jsvis.js 中的多节点选择
【发布时间】:2014-11-12 09:46:55
【问题描述】:

我正在使用 vis.js,因为我喜欢它的网络可视化模块。我想知道,因为我在文档中找不到它,是否可以选择多个节点。

干杯,

里卡多

【问题讨论】:

    标签: javascript networking graph data-visualization chap-links-library


    【解决方案1】:

    我刚刚发现在 vis.js 中你可以选择多个节点长按它们。

    【讨论】:

    • 因为有些时候你也可以使用 ctrl+click 和 shift+click 进行多选。编辑:抱歉,这只适用于时间线,网络尚不支持。
    • 长按和 ctrl+click 也适用于网络,但前提是您启用了多选..
    【解决方案2】:

    在文档中搜索“可选”属性 http://visjs.org/docs/network/

    如果为 true,则可以通过单击选择网络中的节点。长 press 可用于选择多个节点。

    【讨论】:

      【解决方案3】:

      更新! 文档的链接是http://visjs.org/docs/network/interaction.html

      将多选属性设置为 true。

      将此部分添加到您的网络选项对象。

      interaction: { multiselect: true}
      

      【讨论】:

      • 有什么方法可以使用简单的点击而不是长按进行多选?
      • 您好,您可以使用 hack。绑定到事件 selectNode 和 deselectNode.with 那些你可以知道你想要的选定节点是什么。而不是你可以只使用方法 selectNodes。
      【解决方案4】:

      如果您正在寻找一个矩形来选择您的节点,只需查看 visjs-network github 上的此线程:https://github.com/almende/vis/issues/3594

      完整的演示代码:

      const nodes = new vis.DataSet([
          { id: 1, label: 'Node 1' },
          { id: 2, label: 'Node 2' },
          { id: 3, label: 'Node 3' },
          { id: 4, label: 'Node 4' },
          { id: 5, label: 'Node 5' }
      ]);
      
      const edges = new vis.DataSet([
          { from: 1, to: 3 },
          { from: 1, to: 2 },
          { from: 2, to: 4 },
          { from: 2, to: 5 }
      ]);
      
      const options = {
          layout: { randomSeed: 2 },
          interaction:{
          hover: true,
              multiselect: true
          }
      };
      
      // Everything is in there
      const makeMeMultiSelect = (container, network, nodes) => {
          const NO_CLICK = 0;
          const RIGHT_CLICK = 3;
      
          // Disable default right-click dropdown menu
          container[0].oncontextmenu = () => false;
      
          // State
      
          let drag = false, DOMRect = {};
      
          // Selector
      
          const canvasify = (DOMx, DOMy) => {
              const { x, y } = network.DOMtoCanvas({ x: DOMx, y: DOMy });
              return [x, y];
          };
      
          const correctRange = (start, end) =>
              start < end ? [start, end] : [end, start];
      
          const selectFromDOMRect = () => {
              const [sX, sY] = canvasify(DOMRect.startX, DOMRect.startY);
              const [eX, eY] = canvasify(DOMRect.endX, DOMRect.endY);
              const [startX, endX] = correctRange(sX, eX);
              const [startY, endY] = correctRange(sY, eY);
      
              network.selectNodes(nodes.get().reduce(
                  (selected, { id }) => {
                      const { x, y } = network.getPositions(id)[id];
                      return (startX <= x && x <= endX && startY <= y && y <= endY) ?
                          selected.concat(id) : selected;
                  }, []
              ));
          }
      
          // Listeners
      
          container.on("mousedown", function({ which, pageX, pageY }) {
              // When mousedown, save the initial rectangle state
              if(which === RIGHT_CLICK) {
                  Object.assign(DOMRect, {
                      startX: pageX - this.offsetLeft,
                      startY: pageY - this.offsetTop,
                      endX: pageX - this.offsetLeft,
                      endY: pageY - this.offsetTop
                  });
                  drag = true;
              }
          });
      
          container.on("mousemove", function({ which, pageX, pageY }) {
              // Make selection rectangle disappear when accidently mouseupped outside 'container'
              if(which === NO_CLICK && drag) {
                  drag = false;
                  network.redraw();
              }
              // When mousemove, update the rectangle state
              else if(drag) {
                  Object.assign(DOMRect, {
                      endX: pageX - this.offsetLeft,
                      endY: pageY - this.offsetTop
                  });
                  network.redraw();
              }
          });
      
          container.on("mouseup", function({ which }) {
              // When mouseup, select the nodes in the rectangle
              if(which === RIGHT_CLICK) {
                  drag = false;
                  network.redraw();
                  selectFromDOMRect();
              }
          });
      
          // Drawer
      
          network.on('afterDrawing', ctx => {
              if(drag) {
                  const [startX, startY] = canvasify(DOMRect.startX, DOMRect.startY);
                  const [endX, endY] = canvasify(DOMRect.endX, DOMRect.endY);
      
                  ctx.setLineDash([5]);
                  ctx.strokeStyle = 'rgba(78, 146, 237, 0.75)';
                  ctx.strokeRect(startX, startY, endX - startX, endY - startY);
                  ctx.setLineDash([]);
                  ctx.fillStyle = 'rgba(151, 194, 252, 0.45)';
                  ctx.fillRect(startX, startY, endX - startX, endY - startY);
              }
          });
      }; // end makeMeMultiSelect
      
      $(document).ready(() => {
          const container = $("#network");
          const network = new vis.Network(container[0], { nodes, edges }, options);
          makeMeMultiSelect(container, network, nodes);
      });
      

      【讨论】:

        猜你喜欢
        • 2021-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-23
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多