layui-左侧递归菜单-js实现

完整代码 两种下拉风格

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link href="lib/layui/css/layui.css" rel="stylesheet" />
    <!--    <link href="css/layout-admin.css" rel="stylesheet"/>-->
  </head>
  <body class="layui-bg-gray">
    <div class="layui-side">
      <div class="layui-side-scroll">
        <div id="test"></div>
      </div>
    </div>
    <!--<div id="test"></div>-->
    <script src="lib/layui/layui.js"></script>
    <script>
      layui.use(["element", "dropdown"], function () {
        var element = layui.element;
        var dropdown = layui.dropdown;
        var util = layui.util;

        // 假设我们有一个菜单数据
        var menuData = {
          code: 0,
          data: [
            {
              id: 1,
              parentId: 0,
              name: "test-1",
              weight: 1,
              url: "https://blog.csdn.net/weixin_42164004/article/details/115178178",
              type: "link",
              children: [
                {
                  id: 2,
                  parentId: 1,
                  name: "test-2",
                  weight: 2,
                  url: "https://blog.csdn.net/weixin_42164004/article/details/115178178",
                  type: "link",
                  children: [
                    {
                      id: 3,
                      parentId: 2,
                      name: "test-3",
                      weight: 3,
                      url: "https://blog.csdn.net/weixin_42164004/article/details/115178178",
                      type: "link",
                      children: [
                        {
                          id: 4,
                          parentId: 3,
                          name: "test-4",
                          weight: 4,
                          url: "https://blog.csdn.net/weixin_42164004/article/details/115178178",
                          type: "link",
                        },
                      ],
                    },
                  ],
                },
              ],
            },
          ],
          count: 1,
        };

        function buildMenu(id, data) {
          let type = "group";

          function buildMenuTree(items) {
            function isArray(obj) {
              return typeof obj === "object" && Array.isArray(obj);
            }

            function isNotNullArray(obj) {
              if (isArray(obj)) {
                return obj.length > 0;
              }
              return false;
            }

            let html = [];
            for (let i = 0; i < items.length; i++) {
              let item = items[i];
              if (isNotNullArray(item.children)) {
                if (type === "group") {
                  html.push(
                    '<li class="layui-menu-item-group layui-menu-item-up"><div class="layui-menu-body-title"><span>' +
                      item.name +
                      "</span></div><ul>" +
                      buildMenuTree(item.children) +
                      "</ul></li>"
                  );
                } else if (type === "parent") {
                  html.push(
                    '<li class="layui-menu-item-parent layui-menu-item-up"><div class="layui-menu-body-title"><span>' +
                      item.name +
                      '</span> <i class="layui-icon layui-icon-right"></i></div> <div class="layui-panel layui-menu-body-panel" style="width: 200px;"><ul>' +
                      buildMenuTree(item.children) +
                      "</ul></div></li>"
                  );
                }
              } else {
                html.push(
                  '<li><div class="layui-menu-body-title"><span>' +
                    item.name +
                    "</span></div></li>"
                );
              }
            }
            return html.join();
          }

          let html = "";
          if (type === "group") {
            html =
              '<ul class="layui-menu" id="left-menu" lay-filter="left-menu" lay-accordion>' +
              buildMenuTree(data) +
              "</ul>";
          } else if (type === "parent") {
            html =
              '<div class="layui-panel" style="width: 200px;margin: 16px"><ul class="layui-menu" id="left-menu" lay-filter="left-menu" lay-accordion>' +
              buildMenuTree(data) +
              "</ul></div>";
          }
          document.getElementById(id).innerHTML = html;
        }

        buildMenu("test", menuData.data);
        //element.init();
      });
    </script>
  </body>
</html>

freemarker模板引擎实现 对管理后台均可,因为并不需要seo

[#ftl encoding="utf-8"]
[#--递归下拉菜单--]
[#macro list items]
    [#list items]
        [#items as item]
            [#if item.children?? && item.children?size gt 0 ]
                <li class="layui-menu-item-group layui-menu-item-up"
                    lay-options="{id: '${item.id}', parentId: '${item.parentId}', isTab: false, url:'${item.url}', type:'${item.type}'}">
                    <div class="layui-menu-body-title">
                        <span>${item.name}</span>
                    </div>
                    <ul>
                        [@list items=item.children /]
                    </ul>
                </li>
            [#else]
                <li lay-options="{id: '${item.id}', parentId: '${item.parentId}', isTab: true, url:'${item.url}', type:'${item.type}'}">
                    <div class="layui-menu-body-title">
                        <span>${item.name}</span>
                    </div>
                </li>
            [/#if]
        [/#items]
    [/#list]
[/#macro]

<div class="side">
    <ul class="layui-menu layui-menu-lg" id="left-menu" lay-filter="left-menu">
        [@list items= leftMenu /]
    </ul>
</div>

<script>
    layui.use(function () {
        const dropdown = layui.dropdown;
        const element = layui.element;
        const layer = layui.layer;
        const $ = layui.jquery;

        function reportWindowSize(event) {
            const height = $('.layui-body').height() - $('.layui-tab-title').height() - $('.layui-footer').height();
            setTimeout(function () {
                $('.tab-page').css('height', height);
            }, 100);
        }

        window.addEventListener("resize", reportWindowSize);

        dropdown.on('click(left-menu)', function (options) {
            if (options.isTab === true) {
                let exist = false;
                let layId = options.id.toString();
                let $li = $('.layui-tab-title li');
                $li.each(function () {
                    if ($(this).attr('lay-id') === layId) {
                        exist = true;
                    }
                });
                if (!exist) {
                    if ($li.length >= 20) {
                        return;
                    }
                    element.tabAdd("tab-card", {
                        title: options.title,
                        content: '<div id="tab-page-' + layId + '" class="tab-page"></div>',
                        id: layId,
                        change: true
                    });
                    reportWindowSize(null);
                    console.log(options.type);
                    if (options.type === 'page') {
                        $('#page-' + layId).load(options.url,
                            {id: options.id},
                            function (responseTxt, statusTxt, xhr) {
                                if (statusTxt === "success") {

                                } else if (statusTxt === "error") {
                                    layer.alert(options.title + ',加载失败!');
                                    element.tabDelete('tab-card', layId);
                                }
                            });
                    } else if (options.type === 'link') {
                        $('#tab-page-' + layId).html('<iframe title="'+options.title+'" src="' + options.url + '" style="width: 100%;height: 100%;border: none;scrollbar-width=none" scrolling="no">')
                    }
                } else {
                    element.tabChange('tab-card', layId);
                }
            }
        });
    });
</script>







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值