使用json生成Bootstrap无限极导航菜单

使用json生成,无限极菜单。
依赖如下:

  • Bootstrap
  • Jquery
  • bootstrap-submenu.js插件

你可以先访问这里:https://vsn4ik.github.io/bootstrap-submenu/ 了解一下bootstrap-submenu.js 插件,本文例子以bootstrap-submenu.js为基础,根据json生成无限极菜单。
同时,使用了递归。可以先了解一下递归是什么。


代码上传至百度网盘和csdn
链接:http://pan.baidu.com/s/1dFIKNPB 密码:kro0
或者 http://download.csdn.net/detail/u012775558/9814052


生成效果如图:
这里写图片描述

大致思路
由于一级菜单具有不规则性,在本例中是一级菜单达到5个后自动隐藏,因此本例的实现方法是,根据json先生成了一级菜单,然后再递归生成一级菜单的无限极子菜单。
实现步骤
bootstrap-submenu.js插件的实现方式是,在html中放置了标记父子关系的li、ui标签,然后通过js激活菜单,可以参考该页面 https://vsn4ik.github.io/bootstrap-submenu/
下图是一个截图,可以观察一下li、ui的关系。
这里写图片描述

因此本例的实现步骤就是,先获取到json数据,然后根据id与父节点id,处理成树形json,然后根据树形json生成html,然后js激活 无限极菜单。

文件结构
这里写图片描述

test.html内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>json生成无限极菜单</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/bootstrap-submenu.css" rel="stylesheet">
    <script src="js/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
    <script src="js/bootstrap-submenu.js"></script>
    <script src="js/nav.js"></script>
</head>
<body>

<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation" id="nav1">
    <div class="navbar-header">
        <a class="navbar-brand" href="#">
            无限极菜单
        </a>
    </div>
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
        <ul class="nav navbar-nav" id="systemWebMenu">
        </ul>
    </div>
</nav>


<script type="text/javascript">
    $(document).ready(function () {
        showTreeFirst(tree);//生成一级菜单
        showTree(tree);//生成其他菜单
        $('[data-submenu]').submenupicker();//激活多级菜单

    });


</script>

</body>
</html>

nav.js内容
menuData 是普通json,其中会有自身id和他的父节点id-menuIdParent


var menuData = [
    {
        "menuId": "1",
        "title": "系统管理",
        "menuIdParent": "2"
    },
    {
        "menuId": "2",
        "title": "决策分析",
        "menuIdParent": "0"
    },
    {
        "menuId": "3",
        "title": "运营决策",
        "menuIdParent": "0"
    },
    {
        "menuId": "4",
        "title": "知识库",
        "menuIdParent": "0"
    },
    {
        "menuId": "5",
        "title": "运营分析",
        "menuIdParent": "3"
    },
    {
        "menuId": "6",
        "title": "决策分析2",
        "menuIdParent": "3"
    },
    {
        "menuId": "7",
        "title": "运营管理",
        "menuIdParent": "3"
    },
    {
        "menuId": "8",
        "title": "决策管理",
        "menuIdParent": "3"
    },
    {
        "menuId": "9",
        "title": "决策支持",
        "menuIdParent": "4"
    },
    {
        "menuId": "10",
        "title": "人员信息",
        "menuIdParent": "9"
    },
    {
        "menuId": "11",
        "title": "人员管理",
        "menuIdParent": "9"
    },
    {
        "menuId": "12",
        "title": "人员排班",
        "menuIdParent": "9"
    },
    {
        "menuId": "13",
        "title": "系统菜单",
        "menuIdParent": "10"
    },
    {
        "menuId": "14",
        "title": "模块菜单",
        "menuIdParent": "10"
    },
    {
        "menuId": "15",
        "title": "菜单编辑",
        "menuIdParent": "10"
    },
    {
        "menuId": "16",
        "title": "地点管理",
        "menuIdParent": "14"
    },
    {
        "menuId": "17",
        "title": "科室管理",
        "menuIdParent": "14"
    },
    {
        "menuId": "18",
        "title": "图片管理",
        "menuIdParent": "0"
    },
    {
        "menuId": "19",
        "title": "存储信息",
        "menuIdParent": "0"
    },
    {
        "menuId": "20",
        "title": "人员信息",
        "menuIdParent": "0"
    },
    {
        "menuId": "21",
        "title": "机构信息",
        "menuIdParent": "0"
    },
    {
        "menuId": "22",
        "title": "机构管理",
        "menuIdParent": "21"
    },
    {
        "menuId": "23",
        "title": "机构添加",
        "menuIdParent": "21"
    }

];


/*普通json 转成树形json*/
function listToTree(list, pid) {
    var ret = [];//一个存放结果的临时数组
    for (var i in list) {
        if (list[i].menuIdParent == pid) {//如果当前项的父id等于要查找的父id,进行递归
            list[i].children = listToTree(list, list[i].menuId);
            ret.push(list[i]);//把当前项保存到临时数组中
        }
    }
    return ret;//递归结束后返回结果
}

var tree = listToTree(menuData, 0);//调用函数,传入要转换的普通json和树中顶级元素的pid
/*顶级元素的pid:在本例中为0,相当于一级菜单的父节点编号为0*/


/*根据处理过的树形json数据生成一级菜单*/
function showTreeFirst(data) {
    var dataLength = data.length;
    if (dataLength < 6) {//最多生成五个菜单,其余隐藏
        // console.log("dataLength < 6")
        for (var i = 0; i < dataLength; i++) {
            if (data[i].children.length) {//如果有子集
                var html = ' <li class="dropdown"> ' +
                    '<a href="#" data-toggle="dropdown" id="' + data[i].menuId+ '" data-submenu="" > ' + data[i].title + ' </a>' +
                    ' <ul class="dropdown-menu" id="submenu_' + data[i].menuId + '"></ul> </li>  ';
                $("#systemWebMenu").append(html);
            } else {
                var html = ' <li> <a href="#" data-toggle="dropdown" data-submenu=""  id="' + data[i].menuId + '" > ' + data[i].title + ' </a> </li> ';
                $("#systemWebMenu").append(html);
            }
        }
    } else {//最多生成五个菜单,其余隐藏

       /* 先成前五个菜单*/
        for (var i = 0; i < 5; i++) {
            if (data[i].children.length) {//如果有子集
                var html = '  <li class="dropdown">' +
                    ' <a href="#" data-toggle="dropdown"  id="' + data[i].menuId + '" data-submenu="" > ' + data[i].title + ' </a> ' +
                    '<ul class="dropdown-menu" id="submenu_' + data[i].menuId + '"></ul> </li>  ';
                $("#systemWebMenu").append(html);
            } else {
                var html = ' <li> <a href="#" data-toggle="dropdown" data-submenu=""  id="' + data[i].menuId +'" > ' + data[i].title + ' </a> </li> ';
                $("#systemWebMenu").append(html);
            }
        }
        /* 生成“更多”按钮*/
        var html = ' <li class="dropdown"> <a href="#" data-toggle="dropdown" data-submenu=""   id="' + data[i].menuId
            + '" menutitle="' + data[i].title+'">更多<strong class="caret"></strong> </a> ' +
            '<ul class="dropdown-menu" id="moreDropdownMenu"> </ul> </li>';
        $("#systemWebMenu").append(html);

        /* 生成“更多”按钮下的其他一级隐藏菜单*/
        for (var i = 5; i < dataLength; i++) {
            if (data[i].children.length) {//如果有子集
                var html = ' <li class="dropdown-submenu"> <a  id="'+ data[i].menuId +'" >' + data[i].title + '</a> ' + '<ul class="dropdown-menu" id="submenu_' + data[i].menuId + '"> </ul>'
                $("#moreDropdownMenu").append(html);
            } else {
                var html = '<li><a id="'+data[i].menuId+'"  >' + data[i].title + '</a> </li>'
                $("#moreDropdownMenu").append(html);
            }
        }

    }


}


/*根据处理过的树形json数据递归生成一级菜单以外的其他菜单*/
function showTree(data) {
    for (var i = 0; i < data.length; i++) {
        if (data[i].children.length) {//如果有子集
            /* 先判断父节点是否存在*/
            if ($("#submenu_" + data[i].menuIdParent).size() == 0) {
                showTree(data[i].children);//递归调用子集
            } else {
                var html = '<li class="dropdown-submenu">' +
                    ' <a id="'+data[i].menuId+'" >' + data[i].title + '</a>' +
                    '<ul class="dropdown-menu" id="submenu_'+data[i].menuId+'"> </ul>'
                $("#submenu_"+data[i].menuIdParent).append(html);
                showTree(data[i].children);//递归调用子集
            }

        } else {//没有子集直接显示
            var html = '<li><a  id="'+data[i].menuId+'">'+data[i].title+'</a> </li>'
            $("#submenu_" + data[i].menuIdParent).append(html);
        }
    }
}







  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成html中bootstrap导航栏下划菜单的代码如下: ```html <nav class="navbar navbar-expand-lg navbar-light bg-light"> <a class="navbar-brand" href="#">Logo</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNavDropdown"> <ul class="navbar-nav"> <li class="nav-item active"> <a class="nav-link" href="#">Home</a> </li> <li class="nav-item"> <a class="nav-link" href="#">About</a> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> Dropdown link </a> <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink"> <a class="dropdown-item" href="#">Action</a> <a class="dropdown-item" href="#">Another action</a> <a class="dropdown-item" href="#">Something else here</a> </div> </li> </ul> </div> </nav> ``` 这段代码使用Bootstrap 中的导航栏组件 `navbar`,并且通过 `navbar-expand-lg` 类指定了导航栏在大屏幕下展开,使用了淡蓝色背景的 `bg-light` 类。在导航栏中,我们定义了一个品牌 `navbar-brand` 和三个导航链接,其中下拉菜单使用Bootstrap 的下拉菜单组件 `dropdown`,其中链接使用了 `dropdown-toggle` 类指定了可以展开下拉菜单菜单项用 `dropdown-menu` 类进行定义。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值