js树形组件zTree和jstree使用

用到树形组件,研究记录下

zTree

常用用法

<!DOCTYPE html>
<html>
  <head>
    <title>ZTREE DEMO</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <link rel="stylesheet" href="./plugins/zTree_v3-master/css/zTreeStyle/zTreeStyle.css" type="text/css" />
    <style type="text/css">
      .ztree li span.button.add {
        margin-left: 2px;
        margin-right: -1px;
        background-position: -144px 0;
        vertical-align: top;
        vertical-align: middle;
      }
    </style>
  </head>
  <body>
    <ul id="tree" class="ztree"></ul>
    <button class="expand">expand</button>
    <button class="collapse">collapse</button>
    <button class="toggle">toggle</button>
    <button class="expandSon">expandSon</button>
    <button class="collapseSon">collapseSon</button>
    <button class="expandAll">expandAll</button>
    <button class="collapseAll">collapseAll</button>

    <br />
    <button class="count">count</button>
    <button class="checkTrue">checkTrue</button>
    <button class="checkFalse">checkFalse</button>
    <button class="togglecheck">togglecheck</button>
    <button class="checkTruePS">checkTruePS</button>
    <button class="checkFalsePS">checkFalsePS</button>
    <button class="togglePS">togglePS</button>
    <button class="checkAllTrue">checkAllTrue</button>
    <button class="checkAllFalse">checkAllFalse</button>

    <br />
    <button class="upate">upate</button>
    <button class="addParent">addParent</button>
    <button class="addLeaf">addLeaf</button>
    <button class="edit">edit</button>
    <button class="remove">remove</button>
    <button class="clearChildren">clearChildren</button>
  </body>
  <script type="text/javascript" src="./plugins/zTree_v3-master/js/jquery-1.4.4.min.js"></script>
  <script type="text/javascript" src="./plugins/zTree_v3-master/js/jquery.ztree.core.js"></script>
  <script type="text/javascript" src="./plugins/zTree_v3-master/js/jquery.ztree.excheck.js"></script>
  <script type="text/javascript" src="./plugins/zTree_v3-master/js/jquery.ztree.exedit.js"></script>
  <script type="text/javascript">
    let newCount = 1;
    const setting = {
      view: {
        showLine: true,
        showIcon: true,

        selectedMulti: false,
        nameIsHTML: true,

        dblClickExpand: function (treeId, treeNode) {
          return treeNode.level > 0;
        },
        addHoverDom: function (treeId, treeNode) {
          const sObj = $("#" + treeNode.tId + "_span");
          if (treeNode.editNameFlag || $("#addBtn_" + treeNode.tId).length > 0) return;
          const addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='add node' onfocus='this.blur();'></span>";
          sObj.after(addStr);
          const btn = $("#addBtn_" + treeNode.tId);
          if (btn)
            btn.bind("click", function () {
              const zTree = $.fn.zTree.getZTreeObj("tree");
              zTree.addNodes(treeNode, { id: 100 + newCount, pId: treeNode.id, name: "new node" + newCount++ });
              return false;
            });
        },
        removeHoverDom: function removeHoverDom(treeId, treeNode) {
          $("#addBtn_" + treeNode.tId)
            .unbind()
            .remove();
        },
      },
      check: {
        enable: true,
      },
      edit: {
        enable: true,
        editNameSelectAll: true,
        drag: {
          isCopy: true,
          isMove: false,
          prev: true,
          next: true,
          inner: false,
        },
        showRemoveBtn: function (treeId, treeNode) {
          return !treeNode.isFirstNode;
        },
        showRenameBtn: true,
      },
      data: {
        simpleData: {
          enable: true,
        },
      },
      callback: {
        beforeClick: function (treeId, treeNode) {
          if (treeNode.isParent) {
            return true;
          } else {
            return false;
          }
        },
        beforeCollapse: function (treeId, treeNode) {
          return treeNode.collapse !== false;
        },
        beforeExpand: function (treeId, treeNode) {
          return treeNode.expand !== false;
        },
        onCollapse: function (event, treeId, treeNode) {
          console.log(treeId, treeNode);
        },
        onExpand: function (event, treeId, treeNode) {
          console.log(treeId, treeNode);
        },
        onClick: function (e, treeId, treeNode) {
          console.log("clicked", treeId, treeNode);
        },
        beforeDrag: function (treeId, treeNodes) {
          for (let i = 0, l = treeNodes.length; i < l; i++) {
            if (treeNodes[i].drag === false) {
              return false;
            }
          }
          return true;
        },
        beforeDrop: function (treeId, treeNodes, targetNode, moveType) {
          return targetNode ? targetNode.drop !== false : true;
        },
        beforeRemove: function (treeId, treeNode) {
          console.log("remove");
        },
      },
    };

    const nodes = [
      { id: 1, pId: 0, name: "可折腾的父节点 1", open: true, drag: false },
      { id: 11, pId: 1, name: "叶子节点 - 1" },
      { id: 12, pId: 1, name: "可折腾的父节点 2", open: false },
      { id: 121, pId: 12, name: "父节点 - 121", open: true },
      { id: 1211, pId: 121, name: "父节点 - 1211", open: false },
      { id: 1212, pId: 1211, name: "叶子节点 - 1212" },
      { id: 1213, pId: 121, name: "父节点 - 1213", open: false },
      { id: 1214, pId: 1213, name: "叶子节点 - 1214" },
      { id: 123, pId: 12, name: "叶子节点 - 23" },
      { id: 13, pId: 1, name: "叶子节点 - 3" },
      { id: 2, pId: 1, name: "无法折叠的父节点", open: false, collapse: false },
      { id: 21, pId: 2, name: "叶子节点2 - 1" },
      { id: 22, pId: 21, name: "叶子节点2 - 2" },
      { id: 23, pId: 21, name: "叶子节点2 - 3" },
      { id: 3, pId: 2, name: "无法展开的父节点", open: false, expand: false },
      { id: 31, pId: 3, name: "叶子节点3 - 1" },
      { id: 32, pId: 31, name: "叶子节点3 - 2" },
      { id: 33, pId: 31, name: "叶子节点3 - 3" },
      { id: 4, pId: 3, name: "空空的父节点 1", isParent: true, open: false, drop: false },
    ];

    function add(e) {
      const zTree = $.fn.zTree.getZTreeObj("tree"),
        isParent = e.data.isParent,
        nodes = zTree.getSelectedNodes();
      let treeNode = nodes[0];
      // const node = zTree.getNodeByParam("id", nodeId);
      if (treeNode) {
        treeNode = zTree.addNodes(treeNode, { id: 100 + newCount, pId: treeNode.id, isParent: isParent, name: "new node" + newCount++ });
      } else {
        treeNode = zTree.addNodes(null, { id: 100 + newCount, pId: 0, isParent: isParent, name: "new node" + newCount++ });
      }
      if (treeNode) {
        zTree.editName(treeNode[0]);
      } else {
        alert("叶子节点被锁定,无法增加子节点");
      }
    }
    function edit() {
      const zTree = $.fn.zTree.getZTreeObj("tree"),
        nodes = zTree.getSelectedNodes(),
        treeNode = nodes[0];
      if (nodes.length == 0) {
        alert("请先选择一个节点");
        return;
      }
      zTree.editName(treeNode);
    }
    function remove(e) {
      const zTree = $.fn.zTree.getZTreeObj("tree"),
        nodes = zTree.getSelectedNodes(),
        treeNode = nodes[0];
      if (nodes.length == 0) {
        alert("请先选择一个节点");
        return;
      }
      zTree.removeNode(treeNode, false);
    }
    function clearChildren(e) {
      const zTree = $.fn.zTree.getZTreeObj("tree"),
        nodes = zTree.getSelectedNodes(),
        treeNode = nodes[0];
      if (nodes.length == 0 || !nodes[0].isParent) {
        alert("请先选择一个父节点");
        return;
      }
      zTree.removeChildNodes(treeNode);
    }

    function operateNode(e) {
      const zTree = $.fn.zTree.getZTreeObj("tree"),
        type = e.data.type,
        nodes = zTree.getSelectedNodes();
      if (type.indexOf("All") < 0 && nodes.length == 0) {
        alert("请先选择一个父节点");
      }

      if (type == "expandAll") {
        zTree.expandAll(true);
      } else if (type == "collapseAll") {
        zTree.expandAll(false);
      } else if (["expand", "collapse", "toggle", "expandSon", "collapseSon"].indexOf(type) >= 0) {
        for (let i = 0, l = nodes.length; i < l; i++) {
          zTree.setting.view.fontCss = {};
          if (type == "expand") {
            zTree.expandNode(nodes[i], true, null, null, false);
          } else if (type == "collapse") {
            zTree.expandNode(nodes[i], false, null, null, false);
          } else if (type == "toggle") {
            zTree.expandNode(nodes[i], null, null, null, false);
          } else if (type == "expandSon") {
            zTree.expandNode(nodes[i], true, true, null, false);
          } else if (type == "collapseSon") {
            zTree.expandNode(nodes[i], false, true, null, false);
          }
        }
      } else if (type == "update") {
        nodes[0].name = "update node";
        zTree.updateNode(nodes[0]);
      } else if (type == "count") {
        const checkCount = zTree.getCheckedNodes(true).length;
        const nocheckCount = zTree.getCheckedNodes(false).length;
        const changeCount = zTree.getChangeCheckedNodes().length;
        alert(`选中了${checkCount}个节点, 有${nocheckCount}个节点未选中,新增选中了${changeCount}个节点`);
      } else if (type == "checkAllTrue") {
        zTree.checkAllNodes(true);
      } else if (type == "checkAllFalse") {
        zTree.checkAllNodes(false);
      } else {
        for (let i = 0, l = nodes.length; i < l; i++) {
          if (type == "checkTrue") {
            zTree.checkNode(nodes[i], true, false, false);
          } else if (type == "checkFalse") {
            zTree.checkNode(nodes[i], false, false, false);
          } else if (type == "togglecheck") {
            zTree.checkNode(nodes[i], null, false, false);
          } else if (type == "checkTruePS") {
            zTree.checkNode(nodes[i], true, true, false);
          } else if (type == "checkFalsePS") {
            zTree.checkNode(nodes[i], false, true, false);
          } else if (type == "togglePS") {
            zTree.checkNode(nodes[i], null, true, false);
          }
        }
      }
    }

    $(document).ready(function () {
      $.fn.zTree.init($("#tree"), setting, nodes);

      $("button.expand").bind("click", { type: "expand" }, operateNode);
      $("button.collapse").bind("click", { type: "collapse" }, operateNode);
      $("button.toggle").bind("click", { type: "toggle" }, operateNode);
      $("button.expandSon").bind("click", { type: "expandSon" }, operateNode);
      $("button.collapseSon").bind("click", { type: "collapseSon" }, operateNode);
      $("button.expandAll").bind("click", { type: "expandAll" }, operateNode);
      $("button.collapseAll").bind("click", { type: "collapseAll" }, operateNode);

      $("button.update").bind("click", { type: "update" }, operateNode);
      $("button.addParent").bind("click", { isParent: true }, add);
      $("button.addLeaf").bind("click", { isParent: false }, add);
      $("button.edit").bind("click", edit);
      $("button.remove").bind("click", remove);
      $("button.clearChildren").bind("click", clearChildren);

      $("button.count").bind("click", { type: "count" }, operateNode);
      $("button.checkTrue").bind("click", { type: "checkTrue" }, operateNode);
      $("button.checkFalse").bind("click", { type: "checkFalse" }, operateNode);
      $("button.togglecheck").bind("click", { type: "togglecheck" }, operateNode);
      $("button.checkTruePS").bind("click", { type: "checkTruePS" }, operateNode);
      $("button.checkFalsePS").bind("click", { type: "checkFalsePS" }, operateNode);
      $("button.togglePS").bind("click", { type: "togglePS" }, operateNode);
      $("button.checkAllTrue").bind("click", { type: "checkAllTrue" }, operateNode);
      $("button.checkAllFalse").bind("click", { type: "checkAllFalse" }, operateNode);
    });
  </script>
</html>

使用案例

<!DOCTYPE html>
<html>
  <head>
    <title>ZTREE DEMO</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <link rel="stylesheet" href="./plugins/zTree_v3-master/css/zTreeStyle/zTreeStyle.css" type="text/css" />
    <link rel="stylesheet" href="./plugins/bootstrap-5.1.3/css/bootstrap.min.css" type="text/css" />
    <script type="text/javascript" src="./plugins/zTree_v3-master/js/jquery-1.4.4.min.js"></script>
    <script type="text/javascript" src="./plugins/zTree_v3-master/js/jquery.ztree.core.js"></script>
    <script type="text/javascript" src="./plugins/zTree_v3-master/js/jquery.ztree.excheck.js"></script>
    <script type="text/javascript" src="./plugins/bootstrap-5.1.3/js/bootstrap.bundle.js"></script>
    <style>
      .ztree * {
        font-size: 1rem;
      }
    </style>
    <script type="text/javascript">
      const nodeTypes = [
        { id: "root", pId: "", name: "root" },
        { id: "comp1", pId: "root", name: "IM" },
        { id: "comp1-1", pId: "comp1", name: "DD" },
        { id: "comp1-1-1", pId: "comp1-1", name: "CY" },
        { id: "comp1-2", pId: "comp1", name: "CY" },
        { id: "comp1-3", pId: "comp1", name: "WG" },
        { id: "comp2", pId: "root", name: "CX" },
        { id: "comp3", pId: "root", name: "DD" },
        { id: "comp3-1", pId: "comp3", name: "CY" },
        { id: "comp4", pId: "root", name: "CY" },
        { id: "comp5", pId: "root", name: "WG" },
      ];

      var setting1 = {
        view: {
          selectedMulti: false,
          showIcon: false,
          nameIsHTML: true,
          dblClickExpand: dblClickExpand,
        },
        edit: {
          enable: true,
          showRemoveBtn: true,
          showRenameBtn: true,
        },
        data: {
          simpleData: {
            enable: true,
          },
        },
        callback: {
          onClick: onClick1,
          beforeRemove: beforeRemove1,
        },
      };

      const zTreeId = {
        id: 2,
      };
      var zNodes1 = [
        { id: 1, pId: 0, name: "root", open: true, ddesc: "root", dtype: "root", dfiled1: "", dfiled2: "" },
        { id: 2, pId: 1, name: "IM", open: true, ddesc: "IM", dtype: "comp1", dfiled1: "", dfiled2: "" },
      ];

      function dblClickExpand(treeId, treeNode) {
        return treeNode.level > 0;
      }

      function onClick1(e, treeId, treeNode) {
        console.log("clicked");
        $("#editId").val(treeNode.id);
        $("#dtype").val(treeNode.ddesc);
        $("#dfiled1").val(treeNode.dfiled1);
        $("#dfiled2").val(treeNode.dfiled2);
        $("#editForm").show();

        const options = getSubNodes(treeNode.dtype);
        if (options.length > 0) {
          let html = '<option value="">----</option>';
          options.forEach((item) => {
            html += '<option value="' + item.id + '">' + item.name + "</option>";
          });
          $("#subType").html(html);
          $("#addPartId").val(treeNode.id);
          $("#addPartForm").show();
        } else {
          $("#addPartForm").hide();
        }
        if (treeNode.id != 1) {
          $("#deletePart").show();
        } else {
          $("#deletePart").hide();
        }
      }

      function beforeRemove1(treeId, treeNode) {
        console.log("remove");
        return false;
      }

      function getSubNodes(id) {
        const nodes = [];
        nodeTypes.forEach((item) => {
          if (item.pId == id) {
            nodes.push(item);
          }
        });
        return nodes;
      }

      function editNode() {
        const nodeId = $("#editId").val();
        var zTree = $.fn.zTree.getZTreeObj("treeDemo1");
        var node = zTree.getNodeByParam("id", nodeId);
        node.dtype = $("#dtype").val();
        node.dfiled1 = $("#dfiled1").val();
        node.dfiled2 = $("#dfiled2").val();
        node.name = node.ddesc + '<span style="color:blue">' + node.dfiled1 + node.dfiled2 + "</span>";
        zTree.updateNode(node);
        // $("#editForm").hide();
      }

      function addPartNode() {
        const nodeId = $("#addPartId").val();
        var zTree = $.fn.zTree.getZTreeObj("treeDemo1");
        var node = zTree.getNodeByParam("id", nodeId);
        const nodeName = $("#subType option:selected").html();
        const nodeType = $("#subType").val();
        const isParent = getSubNodes(nodeType).length > 0 ? true : false;
        const newNode = { id: zTreeId.id + 1, pId: nodeId, isParent: isParent, name: nodeName, open: true, ddesc: nodeName, dtype: nodeType, dfiled1: "", dfiled2: "" };
        zTree.addNodes(node, newNode);
        zTreeId.id += 1;
        console.log(nodeName, nodeType, zTree.getNodes());
        $("#subType").val("");
        $("#num").val("");
        // $("#addPartForm").hide();
      }

      function deletePartNode() {
        var zTree = $.fn.zTree.getZTreeObj("treeDemo1"),
          nodes = zTree.getSelectedNodes(),
          treeNode = nodes[0];
        if (nodes.length == 0) {
          alert("请先选择一个节点");
          return;
        }
        if (!confirm("确认删除 节点 -- " + treeNode.name + "及其子节点 吗?")) {
          return false;
        }
        zTree.removeChildNodes(treeNode);
        zTree.removeNode(treeNode);
      }

      $(document).ready(function () {
        $.fn.zTree.init($("#treeDemo1"), setting1, zNodes1);
      });
    </script>

    <script>
      //--------------------DOWM-------------------->
      var setting2 = {
        view: {
          selectedMulti: false,
          showIcon: false,
          nameIsHTML: true,
        },
        check: {
          enable: true,
        },
        data: {
          simpleData: {
            enable: true,
          },
        },
        callback: {
          beforeCheck: beforeCheck2,
          onClick: onClick2,
        },
      };

      var zNodes2 = [
        { id: 1, pId: 0, name: "root", open: true },
        { id: 2, pId: 1, name: "IM", open: true },
        { id: 3, pId: 2, name: "DD", open: true },
        { id: 4, pId: 3, name: "CY", open: true },
        { id: 5, pId: 1, name: "DD", open: true },
        { id: 6, pId: 5, name: "CY", open: true },
        { id: 7, pId: 1, name: "CX", open: true },
        { id: 8, pId: 1, name: "CY", open: true },
        { id: 9, pId: 1, name: "WG", open: true },
      ];

      function beforeCheck2(treeId, treeNode) {
        return treeNode.doCheck !== false;
      }

      function onClick2(e, treeId, treeNode) {
        $(".type-form").hide();
        $("#" + treeNode.name + "Form").show();
      }

      $(document).ready(function () {
        $.fn.zTree.init($("#treeDemo2"), setting2, zNodes2);
      });
    </script>
  </head>

  <body class="bg-light">
    <div class="container-fluid">
      <div class="row mt-4 g-1">
        <div class="col-3">
          <div class="card" style="height: 400px">
            <div class="card-header">树状图</div>
            <div class="card-body">
              <ul id="treeDemo1" class="ztree"></ul>
            </div>
          </div>
        </div>
        <div class="col-3">
          <div class="card mb-3" style="height: 275px; display: none" id="editForm">
            <div class="card-header">编辑</div>
            <div class="card-body">
              <div class="form">
                <form>
                  <input type="hidden" name="did" id="editId" value="" />
                  <div class="input-group mb-3">
                    <span class="input-group-text">name</span>
                    <input type="text" class="form-control" id="dtype" name="dtype" disabled />
                  </div>
                  <div class="input-group mb-3">
                    <span class="input-group-text" id="basic-addon2">字段1</span>
                    <input type="text" class="form-control" id="dfiled1" name="dfiled1" />
                  </div>
                  <div class="input-group mb-3">
                    <span class="input-group-text">字段2</span>
                    <input type="text" class="form-control" id="dfiled2" name="dfiled2" />
                  </div>
                  <div class="input-group">
                    <button type="button" class="btn btn-primary" onclick="editNode()">确定</button>
                  </div>
                </form>
              </div>
            </div>
          </div>
          <div class="card" style="height: 220px; display: none" id="addPartForm">
            <div class="card-header">新增子节点</div>
            <div class="card-body">
              <div class="form">
                <form>
                  <input type="hidden" name="did" id="addPartId" value="" />
                  <div class="input-group mb-3">
                    <span class="input-group-text">name</span>
                    <select class="form-control" name="subType" id="subType">
                      <option value="">----</option>
                    </select>
                  </div>
                  <div class="input-group mb-3">
                    <span class="input-group-text" id="basic-addon2">数量</span>
                    <input type="text" class="form-control" id="num" name="num" />
                  </div>
                  <div class="input-group">
                    <button type="button" class="btn btn-primary" onclick="addPartNode()">新增</button>
                  </div>
                </form>
              </div>
            </div>
          </div>
          <div class="card p-3 mt-3" id="deletePart" style="display: none">
            <button class="btn btn-primary" onclick="deletePartNode()">删除此节点</button>
          </div>
        </div>
        <div class="col-3">
          <div class="card" style="height: 400px">
            <div class="card-header">组成树状图</div>
            <div class="card-body">
              <ul id="treeDemo2" class="ztree"></ul>
            </div>
          </div>
        </div>
        <div class="col-3">
          <div class="card mb-3" style="height: 400px">
            <div class="card-header">编辑</div>
            <div class="card-body">
              <div id="rootForm" class="type-form" style="display: none">
                <nav>
                  <div class="nav nav-pills" role="tablist">
                    <a class="nav-link active" id="nav1-1-tab" data-bs-toggle="tab" data-bs-target="#nav1-1" role="tab" aria-controls="nav1-1" aria-selected="true">BZ</a>
                    <a class="nav-link" id="nav1-2-tab" data-bs-toggle="tab" data-bs-target="#nav1-2" role="tab" aria-controls="nav1-2" aria-selected="false">ZC</a>
                  </div>
                </nav>
                <div class="tab-content">
                  <div class="tab-pane fade show active" id="nav1-1" role="tabpanel" aria-labelledby="nav1-1-tab">ROOT BZ</div>
                  <div class="tab-pane fade" id="nav1-2" role="tabpanel" aria-labelledby="nav1-2-tab">ROOT ZC</div>
                </div>
              </div>
              <div id="IMForm" class="type-form" style="display: none">
                <nav>
                  <div class="nav nav-pills" role="tablist">
                    <a class="nav-link active" id="nav2-1-tab" data-bs-toggle="tab" data-bs-target="#nav2-1" role="tab" aria-controls="nav2-1" aria-selected="true">BZ</a>
                    <a class="nav-link" id="nav2-2-tab" data-bs-toggle="tab" data-bs-target="#nav2-2" role="tab" aria-controls="nav2-2" aria-selected="false">ZC</a>
                  </div>
                </nav>
                <div class="tab-content">
                  <div class="tab-pane fade show active" id="nav2-1" role="tabpanel" aria-labelledby="nav2-1-tab">IM BZ</div>
                  <div class="tab-pane fade" id="nav2-2" role="tabpanel" aria-labelledby="nav2-2-tab">IM ZC</div>
                </div>
              </div>
              <div id="CXForm" class="type-form" style="display: none">
                <nav>
                  <div class="nav nav-pills" role="tablist">
                    <a class="nav-link active" id="nav3-1-tab" data-bs-toggle="tab" data-bs-target="#nav3-1" role="tab" aria-controls="nav3-1" aria-selected="true">BZ</a>
                    <a class="nav-link" id="nav3-2-tab" data-bs-toggle="tab" data-bs-target="#nav3-2" role="tab" aria-controls="nav3-2" aria-selected="false">ZC</a>
                  </div>
                </nav>
                <div class="tab-content">
                  <div class="tab-pane fade show active" id="nav3-1" role="tabpanel" aria-labelledby="nav3-1-tab">CX BZ</div>
                  <div class="tab-pane fade" id="nav3-2" role="tabpanel" aria-labelledby="nav3-2-tab">CX ZC</div>
                </div>
              </div>
              <div id="DDForm" class="type-form" style="display: none">
                <nav>
                  <div class="nav nav-pills" role="tablist">
                    <a class="nav-link active" id="nav4-1-tab" data-bs-toggle="tab" data-bs-target="#nav4-1" role="tab" aria-controls="nav4-1" aria-selected="true">BZ</a>
                    <a class="nav-link" id="nav4-2-tab" data-bs-toggle="tab" data-bs-target="#nav4-2" role="tab" aria-controls="nav4-2" aria-selected="false">ZC</a>
                  </div>
                </nav>
                <div class="tab-content">
                  <div class="tab-pane fade show active" id="nav4-1" role="tabpanel" aria-labelledby="nav4-1-tab">DD BZ</div>
                  <div class="tab-pane fade" id="nav4-2" role="tabpanel" aria-labelledby="nav4-2-tab">DD ZC</div>
                </div>
              </div>
              <div id="CYForm" class="type-form" style="display: none">
                <nav>
                  <div class="nav nav-pills" role="tablist">
                    <a class="nav-link active" id="nav5-1-tab" data-bs-toggle="tab" data-bs-target="#nav5-1" role="tab" aria-controls="nav5-1" aria-selected="true">BZ</a>
                    <a class="nav-link" id="nav5-2-tab" data-bs-toggle="tab" data-bs-target="#nav5-2" role="tab" aria-controls="nav5-2" aria-selected="false">ZC</a>
                  </div>
                </nav>
                <div class="tab-content">
                  <div class="tab-pane fade show active" id="nav5-1" role="tabpanel" aria-labelledby="nav5-1-tab">CY BZ</div>
                  <div class="tab-pane fade" id="nav5-2" role="tabpanel" aria-labelledby="nav5-2-tab">CY ZC</div>
                </div>
              </div>
              <div id="WGForm" class="type-form" style="display: none">
                <nav>
                  <div class="nav nav-pills" role="tablist">
                    <a class="nav-link active" id="nav6-1-tab" data-bs-toggle="tab" data-bs-target="#nav6-1" role="tab" aria-controls="nav6-1" aria-selected="true">BZ</a>
                    <a class="nav-link" id="nav6-2-tab" data-bs-toggle="tab" data-bs-target="#nav6-2" role="tab" aria-controls="nav6-2" aria-selected="false">ZC</a>
                  </div>
                </nav>
                <div class="tab-content">
                  <div class="tab-pane fade show active" id="nav6-1" role="tabpanel" aria-labelledby="nav6-1-tab">WG BZ</div>
                  <div class="tab-pane fade" id="nav6-2" role="tabpanel" aria-labelledby="nav6-2-tab">WG ZC</div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </body>
</html>

jstree

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>jsTree test</title>
    <link rel="stylesheet" href="./plugins/jstree/themes/proton/style.min.css" />
    <!-- <link rel="stylesheet" href="./plugins/jstree/themes/default/style.min.css" /> -->
    <link rel="stylesheet" href="./plugins/bootstrap-icons-1.9.1/bootstrap-icons.css" />
  </head>
  <body>
    <div id="jstree"></div>
    <button class="get">get</button>
    <button class="select">select | deselect</button>
    <button class="open">open | close</button>
    <button class="enable">enable | disable</button>
    <button class="destroy">destroy tree</button>

    <script src="./plugins/jquery/jquery-1.12.4.min.js"></script>
    <script src="./plugins/jstree/jstree.js"></script>
    <script>
      $(function () {
        $("#jstree").jstree({
          core: {
            //定制启用对树的修改
            check_callback: function (operation, node, node_parent, node_position, more) {
              // operation :'create_node', 'rename_node', 'delete_node', 'move_node', 'copy_node'
              return operation === "rename_node" ? true : false;
            },
            //全部启用对树的修改
            check_callback: true,
            //主题配置
            themes: {
              name: "proton", //主题的名称
              variant: false, //变大large 或者变小 small
              // icons: false, //图标
              // dots: false, //连接边线
              // stripes: false, //条纹
            },
            //数据
            data: [
              { id: "ajson1", parent: "#", text: "Simple root node", icon: "bi bi-file-earmark" },
              { id: "ajson2", parent: "#", text: "Root node 2" },
              { id: "ajson3", parent: "ajson2", text: "Child 1", icon: "bi bi-file-earmark" },
              { id: "ajson4", parent: "ajson2", text: "Child 2", icon: "bi bi-file-earmark" },
              { id: "ajson5", parent: "ajson3", text: "Child 1 -1", icon: "bi bi-file-earmark" },
              { id: "ajson6", parent: "ajson5", text: "Child 1 -1 -1", icon: "bi bi-file-earmark" },
            ],
          },
          //插件  复选框、改变图标样式,
          // 全部插件包括:checkbox contextmenu dnd massload search sort state types unique wholerow changed conditionalselect
          plugins: ["checkbox", "types", "contextmenu", "state"],
          //复选框配置
          checkbox: {
            keep_selected_style: false,
          },
          //类型配置
          types: {
            default: {
              icon: "bi bi-folder2",
            },
          },
          state: {
            opened: true,
          },
          contextmenu: {
            items: {
              add: {
                label: "add",
                action: function (obj) {
                  console.log(obj);
                  // $.jstree.reference("#jstree").get_node(obj.reference).create_node("ajson7");
                },
              },
            },
          },
        });

        //监听事件
        $("#jstree").on("changed.jstree", function (e, data) {
          console.log(data.selected);
        });

        const tree = $("#jstree").jstree(true);
        // console.log(tree.get_container());

        $("button.get").on("click", function () {
          console.log(tree.get_node("ajson1"));
          console.log(tree.get_path("ajson3"));
          console.log(tree.get_parent("ajson3"));
          console.log(tree.get_json("ajson3"));
          console.log(tree.is_parent("ajson2"));
          console.log(tree.is_loaded("ajson2"));
          console.log(tree.is_open("ajson2"));
          console.log(tree.is_closed("ajson2"));
          console.log(tree.is_leaf("ajson2"));
          console.log(tree.is_disabled("ajson2"));
          console.log(tree.is_selected("ajson2"));
        });

        $("button.select").on("click", function () {
          // $("#jstree").jstree(true).select_node("ajson1");
          // $("#jstree").jstree("select_node", "ajson1");
          // $.jstree.reference("#jstree").select_node("ajson1");
          // tree.select_node("ajson1");
          tree.select_all();

          // tree.deselect_node("ajson1");
          // tree.deselect_all();

          console.log(tree.get_selected());
          console.log(tree.get_top_selected());
          console.log(tree.get_bottom_selected());
        });

        $("button.open").on("click", function () {
          // tree.open_node("ajson2");
          // tree.open_all();

          // tree.close_node("ajson2");
          // tree.close_all();

          tree.toggle_node("ajson2");
        });

        $("button.enable").on("click", function () {
          // tree.enable_node("ajson2");

          tree.disable_node("ajson4");
        });

        //销毁树
        $("button.destroy").on("click", function () {
          $("#jstree").jstree("destroy");
        });
      });
    </script>
  </body>
</html>

 

posted @   carol2014  阅读(91)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示