html+js案例动态获取菜单

本文介绍:通过html+js实现动态获取菜单(通过 JavaScript代码动态地创建一个网站导航菜单,并将其添加到页面中)。数据是数组对象,利用创建元节点、创建文本节点及创建的节点放入父元素等知识实现该效果。
完整代码如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>动态菜单获取</title>
  </head>
  <body>
    <header>
      <nav></nav>
    </header>
    <script>
      let menu = [
        {
          name: "首页",
        },
        {
          name: "公司介绍",
          children: [
            {
              name: "菜单一",
            },
            { name: "菜单二" },
            { name: "菜单三" },
          ],
        },
        {
          name: "产品",
          children: [
            { name: "菜单一" },
            { name: "菜单二" },
            { name: "菜单三" },
            { name: "菜单四" },
          ],
        },
        {
          name: "关于我们",
        },
        {
          name: "新闻",
        },
      ];
      // 找到装菜单ul的元素
      let box = document.getElementsByTagName("nav")[0];
      function menuItem(menu, box) {
        // 创建一个ul
        let ullist = document.createElement("ul");
        menu.forEach(function (item, index) {
          // 如果子菜单存在
          if ((item.children)) {
            // 创建一个li
            let lilist = document.createElement("li");
            // 创建li里面包裹的a标签
            let allA = document.createElement("a");
            // 将一级菜单名写入文本标签
            let text = document.createTextNode(item.name);
            // 文本加入a标签
            allA.appendChild(text);
            // a标签加入li标签
            lilist.appendChild(allA);
            // li标签加入ul标签
            ullist.appendChild(lilist);
            // 函数回调,再去判断二级菜单是否还有子菜单
            menuItem(item.children, lilist);
          } 
          // 如果没有子菜单
          else {
            ullist.innerHTML +=`<li><a href=""> ${item.name} </a></li>`; 
          }
        });
        // 将ul加入页面,展示在页面
        box.appendChild(ullist);
      }
      // 函数自执行
      menuItem(menu, box);
    </script>
  </body>
</html>

代码解析如下:
1、这里采用数组对象的数据格式。
当以后要修改数据时,直接改这一部分数据即可,就可以更新菜单。数组对象格式:[ { } ,{ },{ }…]

      let menu = [
        {
          name: "首页",
        },
        {
          name: "公司介绍",
          children: [
            {
              name: "菜单一",
            },
            { name: "菜单二" },
            { name: "菜单三" },
          ],
        },
        {
          name: "产品",
          children: [
            { name: "菜单一" },
            { name: "菜单二" },
            { name: "菜单三" },
            { name: "菜单四" },
          ],
        },
        {
          name: "关于我们",
        },
        {
          name: "新闻",
        },
      ];

2、html结构
这里用nav标签装ul等内容

    <header>
      <nav></nav>
    </header>

3、获取一级二级菜单内容并显示在页面上
首先,代码寻找页面上的导航菜单容器元素。

      let box = document.getElementsByTagName("nav")[0];

然后,代码定义了一个名为 menuItem 的函数,这个函数接受两个参数:菜单数据(即包含菜单条目的对象数组)和导航菜单容器元素。
接着,函数创建一个 ul 元素,并遍历菜单数据的每个条目。

如果条目有子菜单,那么函数会创建一个 li 元素和一个 a 元素,将一级菜单名添加到 a 元素中,再将 a 元素添加到 li 元素中,最后将 li 元素添加到 ul 元素中,并使用递归调用自身函数,处理子菜单。
如果条目没有子菜单,那么函数会直接将带有菜单名的 li 元素添加到 ul 元素中。最后,函数将 ul 元素添加到导航菜单容器元素中,这样导航菜单就会被展示在页面上。

      function menuItem(menu, box) {
        // 创建一个ul
        let ullist = document.createElement("ul");
        menu.forEach(function (item, index) {
          // 如果子菜单存在
          if ((item.children)) {
            // 创建一个li
            let lilist = document.createElement("li");
            // 创建li里面包裹的a标签
            let allA = document.createElement("a");
            // 将一级菜单名写入文本标签
            let text = document.createTextNode(item.name);
            // 文本加入a标签
            allA.appendChild(text);
            // a标签加入li标签
            lilist.appendChild(allA);
            // li标签加入ul标签
            ullist.appendChild(lilist);
            // 函数回调,再去判断二级菜单是否还有子菜单
            menuItem(item.children, lilist);
          } 
          // 如果没有子菜单
          else {
            ullist.innerHTML +=`<li><a href=""> ${item.name} </a></li>`; 
          }
        });
        // 将ul加入页面,展示在页面
        box.appendChild(ullist);
      }
      // 函数自执行
      menuItem(menu, box);
    </script>

效果如下:(注意-样式效果可以自行通过csst添加)
在这里插入图片描述

如有错误,请大家留言,马上更正。如果以上内容对你有帮助,动动灵活的小手手点点赞

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值