如图,要做一个两级的下拉标签,可以用函数实现,但是太麻烦,而且不灵活,查阅资料之后发现,jsTree很方便,下面介绍一下jsTree的入门,并附上代码。
阅读jsTree的官方文档之后,你会知道,它有很多实现方式,我下面使用的是Ajax请求,从后台获取json数据返回给jsTree。

jsTree的官网:https://www.jstree.com/
点击页面的Download按钮,下载并解压之后,将dist下的文件都复制到你自己的项目中

Html代码

<html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>通信监测</title><script type="application/javascript"    src="plugins/jQuery/jquery-2.2.3.min.js"></script><link rel="stylesheet" href="dist/js/themes/default/style.min.css" /><script type="application/javascript" src="dist/js/jstree.js"></script></head><script> $(function() {            $('#routerip').jstree({                "core" : {                    'data' : {                        'url' : "router/selectConEqui",//后台访问路径                        'data' : function(node) {                            console.log(node);                            return node;                        }                    },                    "themes" : {                        "ellipsis" : true                    //文字多时省略                    },                    "check_callback" : true                },                "types" : {                    "default" : {                        "icon" : "false"                    },                    "text" : {                        "icon" : "false"                    }                },                "plugins" : [ "wholerow", "types", "themes" ]            }).on('select_node.jstree', function(event, data) {                //console.log(data.node);            }).on('changed.jstree', function(event, data) {                //console.log("-----------changed.jstree");                //console.log("action:" + data.action);                //console.log(data.node);            });        });            function create() {        debugger;        var ref = $('#jstree1').jstree(true);        var currNode = _getCurrNode();        currNode = ref.create_node(currNode, {            "type" : "file"        });        if (currNode) {            ref.edit(currNode);        }    }    function rename() {        var ref = $('#jstree1').jstree(true);        var currNode = _getCurrNode();        ref.rename_node(currNode, "rename node222");    }    function del() {        var ref = $('#jstree1').jstree(true);        var currNode = _getCurrNode();        ref.delete_node(currNode);    }    function moveup() {        var ref = $('#jstree1').jstree(true);        var currNode = _getCurrNode();        var prevNode = ref.get_prev_dom(currNode, true);        ref.move_node(currNode, prevNode, 'before');    }    function movedown() {        var ref = $('#jstree1').jstree(true);        var currNode = _getCurrNode();        var nextNode = ref.get_next_dom(currNode, true);//返回兄弟节点的下一个节点          ref.move_node(currNode, nextNode, 'after');    }    /**       *   获取当前所选中的结点       */    function _getCurrNode() {        var ref = $('#jstree1').jstree(true), sel = ref.get_selected();        console.log(sel);        if (!sel.length) {            console.log("----");            return false;        }        selsel = sel[0];        return sel;    }</script></head><body>    <input type="button" value="create node" onclick="create();">    <input type="button" value="rename node" onclick="rename();">    <input type="button" value="del node" onclick="del();">    <input type="button" value="上移" onclick="moveup();">    <input type="button" value="下移" onclick="movedown();">    <div id="jstree1" style="width: 200px; background: #fff322"></div></body></html>

后台代码

    @ResponseBody    public void selectConEqui(Model model, HttpServletRequest request, HttpServletResponse response)            throws IOException {        List<Map<String, String>> router = routerService.selectConEqui();        response.setContentType("application/json; charset=UTF-8");        response.getWriter().write(new Gson().toJson(router));    }

数据库存储格式

sql查询

<select id="selectMenu"  resultType="java.util.HashMap">    select     <include refid="Base_Column_List" />    from menu  </select>

返回前端的json格式为

注意几点:1.根级parent的值固定设为“#”,其他的不能识别;
2.“parent”,“id",”text“都是固定的命名,且都是小写,如果数据库字段是大写,可以AS为小写;
如果没有这样的数据库结构,也可以通过后台代码将数据改造为上述格式

更多详细的用法,可以参考官方网站