您的位置:

用JavaScript编写树形下拉框实现多级选择

一、树形结构介绍

在数据结构中,树是一种非常常见的数据结构。树是由n(n>=1)个有限节点组成一个具有层次关系的集合。为了便于理解,我们可以将树形结构类比为公司的组织架构或家谱结构。继承关系是一种树形结构,在数据呈现上也是如此。

这里我们提到树形结构,只是用来说明JavaScript如何处理树形下拉框的逻辑关系。这样的数据结构可以使用嵌套的select元素来实现数据的层次关系。

二、实现原理

对于树形下拉框的实现,最常用的方法是通过递归来构建多个select元素。核心代码如下:

//树形下拉框递归函数
function buildOption(dom, data){
    if(Object.prototype.toString.call(data) === '[object Array]' && data.length > 0){
        for(var i = 0; i < data.length; i++){
            var option = document.createElement('option');
            option.value = data[i].value;
            option.innerHTML = data[i].name;
            dom.appendChild(option);
            if(data[i].children && data[i].children.length > 0){
                buildOption(option, data[i].children);
            }
        }
    }
}

当我们调用buildOption方法时,它会对传入的数据进行遍历,并根据数据中层次关系的不同,建立多个select元素。

三、代码示例

下面是一个完整的实例,其中我们使用了一个名为"data"的数组来存储树形结构的数据:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>树形下拉框示例</title>
</head>
<body>
<select id="level1"></select>
<select id="level2"></select>
<select id="level3"></select>
<script type="text/javascript">
//树形下拉框递归函数
function buildOption(dom, data){
    if(Object.prototype.toString.call(data) === '[object Array]' && data.length > 0){
        for(var i = 0; i < data.length; i++){
            var option = document.createElement('option');
            option.value = data[i].value;
            option.innerHTML = data[i].name;
            dom.appendChild(option);
            if(data[i].children && data[i].children.length > 0){
                buildOption(option, data[i].children);
            }
        }
    }
}
//数据
var data = [
{
    "value": "level1_1",
    "name": "第一级1",
    "children": [
        {
            "value": "level2_1",
            "name": "第二级1",
            "children": [
                {
                    "value": "level3_1",
                    "name": "第三级1"
                },
                {
                    "value": "level3_2",
                    "name": "第三级2"
                }
            ]
        },
        {
            "value": "level2_2",
            "name": "第二级2",
            "children": [
                {
                    "value": "level3_3",
                    "name": "第三级3"
                },
                {
                    "value": "level3_4",
                    "name": "第三级4"
                }
            ]
        }
    ]
},
{
    "value": "level1_2",
    "name": "第一级2",
    "children": [
        {
            "value": "level2_3",
            "name": "第二级3",
            "children": [
                {
                    "value": "level3_5",
                    "name": "第三级5"
                },
                {
                    "value": "level3_6",
                    "name": "第三级6"
                }
            ]
        },
        {
            "value": "level2_4",
            "name": "第二级4",
            "children": [
                {
                    "value": "level3_7",
                    "name": "第三级7"
                },
                {
                    "value": "level3_8",
                    "name": "第三级8"
                }
            ]
        }
    ]
}
];

//建立三个select元素
buildOption(document.getElementById('level1'), data);

//第一级改变时,动态生成第二级
document.getElementById('level1').addEventListener('change', function(){
    var value = this.value;
    var level2Data = null;
    for(var i = 0; i < data.length; i++){
        if(data[i].value === value){
            level2Data = data[i].children;
            break;
        }
    }
    document.getElementById('level2').innerHTML = '';
    buildOption(document.getElementById('level2'), level2Data);
    document.getElementById('level3').innerHTML = '';
});

//第二级改变时,动态生成第三级
document.getElementById('level2').addEventListener('change', function(){
    var value = this.value;
    var level3Data = null;
    for(var i = 0; i < data.length; i++){
        var level2s = data[i].children;
        for(var j = 0; j < level2s.length; j++){
            if(level2s[j].value === value){
                level3Data = level2s[j].children;
                break;
            }
        }
    }
    document.getElementById('level3').innerHTML = '';
    buildOption(document.getElementById('level3'), level3Data);
});
</script>

</body>
</html>
用JavaScript编写树形下拉框实现多级选择

2023-05-22
js层级选择框样式(JS选择框)

本文目录一览: 1、如何用JS选中下拉框选项 2、js层次选择器div+one 这个+号代表什么 3、jQuery层次选择器用法示例 4、用js怎么设置单元格的边框 5、如何用js实现select下拉

2023-12-08
下拉选择框的综合使用

2023-05-20
LayuiTreeTable插件:实现树形结构展示的Java

2023-05-23
HTML多选下拉框的详细解析

2023-05-17
js绑定下拉框数据库,winform下拉框绑定数据库

本文目录一览: 1、用JS将数据库中的值赋值给下拉列表框的问题 2、JSP页面中,怎样在一个下拉框选项中绑定数据库表字段? 表名DeviceManage 字段:DEVICETYPE 3、JS返回值绑定

2023-12-08
extjstimefiled时间下拉选择ampm的简单介绍

2022-11-27
JSP下拉框如何实现数据的动态绑定与一键选择

2023-05-19
js树形结构样式,js树形组织图

本文目录一览: 1、求大神指点js生成树结构 2、如何使用js实现select下拉框里是树形结构 3、js的树形结构怎么实现 4、如何用js实现select下拉框里是树形结构,可复选,select框中

2023-12-08
php递归函数树状列表,php树形结构

2022-11-28
HTML下拉框选择事件详解

2023-05-18
js实现二级联动简单实例(js下拉框二级联动)

本文目录一览: 1、怎么用angularJS来实现下图的二级联动啦 2、javascript实现二级联动,比如连个下拉列表,一个选择省份,另一个自动出现相应城市 3、求js二级联动value与显示内容

2023-12-08
下拉多选框的使用详解

2023-05-19
Excel下拉框多选

2023-05-18
jsp里三角形下拉框源代码,jsp下拉框代码怎么写

本文目录一览: 1、jsp里三角形下拉框源代码 求教! 2、jsp中关于给下拉框定位的代码 3、jsp下拉框怎么写 jsp里三角形下拉框源代码 求教! htmlheadstyle.div1{ widt

2023-12-08
发篇java复习笔记(java课程笔记)

2022-11-09
js下拉框选择年月日代码(js日期选择框)

本文目录一览: 1、根据当前时间显示下拉列表的年月,需要显示之前六个月,用JS怎么来弄? 2、js实现下拉选项默认为当前年月 3、如何用js设置select为当前年月 4、js日期下拉框怎么写 根据当

2023-12-08
javascript水平树,js 行为树

2022-11-23
css设置的js对话框(js 选择文件对话框)

本文目录一览: 1、怎样用 CSS + JS 美化网页中的 select 下拉框 2、笔记:JS设置CSS样式的几种方式 3、怎么用div+css和js制作回复窗口 4、如何用JS点击超链接弹出对话框

2023-12-08
下拉框多选详细阐述

2023-05-19