当前位置:首页 > JavaScript

js实现树形菜单

2026-04-04 02:59:13JavaScript

实现树形菜单的基本思路

树形菜单通常由嵌套的列表结构构成,通过JavaScript动态生成HTML元素并控制其展开/折叠状态。核心逻辑包括数据结构的定义、DOM操作和事件绑定。

数据结构设计

树形菜单的数据通常以嵌套对象或数组表示,每个节点包含idlabelchildren等属性。例如:

const treeData = [
  {
    id: 1,
    label: "节点1",
    children: [
      {
        id: 2,
        label: "子节点1",
        children: []
      }
    ]
  }
];

递归渲染树形结构

通过递归函数遍历数据并生成对应的HTML元素:

function renderTree(node, parentElement) {
  const li = document.createElement('li');
  li.innerHTML = `<span>${node.label}</span>`;

  if (node.children && node.children.length > 0) {
    const ul = document.createElement('ul');
    node.children.forEach(child => renderTree(child, ul));
    li.appendChild(ul);
  }

  parentElement.appendChild(li);
}

添加展开/折叠功能

为每个可展开的节点添加点击事件,通过CSS类控制子菜单的显示/隐藏:

li.querySelector('span').addEventListener('click', function() {
  const ul = this.parentNode.querySelector('ul');
  if (ul) ul.classList.toggle('hidden');
});

对应的CSS样式:

.hidden { display: none; }

完整实现示例

document.addEventListener('DOMContentLoaded', function() {
  const treeData = [
    {
      id: 1,
      label: "根节点",
      children: [
        {
          id: 2,
          label: "子节点1",
          children: [
            { id: 3, label: "子子节点1", children: [] }
          ]
        },
        { id: 4, label: "子节点2", children: [] }
      ]
    }
  ];

  const treeContainer = document.getElementById('tree');
  treeData.forEach(node => renderTree(node, treeContainer));

  function renderTree(node, parentElement) {
    const li = document.createElement('li');
    const span = document.createElement('span');
    span.textContent = node.label;
    li.appendChild(span);

    if (node.children && node.children.length > 0) {
      const ul = document.createElement('ul');
      node.children.forEach(child => renderTree(child, ul));
      li.appendChild(ul);

      span.addEventListener('click', function(e) {
        e.stopPropagation();
        ul.classList.toggle('hidden');
      });
    }

    parentElement.appendChild(li);
  }
});

使用第三方库简化开发

如果需要更复杂的功能(如拖拽、复选框等),可以考虑使用现成的树形菜单库:

  1. jsTree:功能丰富的jQuery插件

    $('#tree').jstree({
      'core': {
        'data': treeData
      }
    });
  2. zTree:轻量级的纯JavaScript实现

  3. Vue/React生态

    js实现树形菜单

    • Vue: vue-treeselect
    • React: react-treebeard

标签: 菜单js
分享给朋友:

相关文章

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…