关联选择 可以无限扩展

93 阅读1分钟

实现方式:JSON+JS

JSON用例为:

北京
 ├┈延庆
     ├┈营口村
         ├┈测试
     ├┈营口村2
 ├┈密云
天津
 ├┈天一村
 ├┈天二村
河北
organization = {
            "name": "项目名称",
            "projectId": 1,
            "children": [
                {
                    "name": "北京",
                    "children": [
                        {
                            "name": "延庆",
                            "children": [
                                {
                                    "name": "营口村",
                                    "children": [
                                        {
                                            "name": "测试"
                                        }
                                    ]
                                },
                                {
                                    "name": "营口村2",
                                }
                            ]
                        },
                        {
                            "name": "密云",
                        }
                    ]
                },
                {
                    "name": "天津",
                    "children": [
                        {
                            "name": "天一村"
                        },
                        {
                            "name": "天二村"
                        }
                    ]
                },
                {
                    "name": "河北",
                }
            ]
        }

效果图:

5BD7F9E8-5790-453a-9070-0424D072B839.png

DD57D8CB-C400-4259-AD71-438C223A9F91.png

CC35D89F-C1E5-40bc-8720-8484C182C305.png

每次选择都会打印出来当前的选择项索引

Dingtalk_20220113160248.jpg

完整代码:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="utf-8">
    <title>关联选择-可以无限拓展</title>
    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
    <script type="text/javascript">
        const organization = {
            "name": "项目名称",
            "projectId": 1,
            "children": [
                {
                    "name": "北京",
                    "children": [
                        {
                            "name": "延庆",
                            "children": [
                                {
                                    "name": "营口村",
                                    "children": [
                                        {
                                            "name": "测试"
                                        }
                                    ]
                                },
                                {
                                    "name": "营口村2",
                                }
                            ]
                        },
                        {
                            "name": "密云",
                        }
                    ]
                },
                {
                    "name": "天津",
                    "children": [
                        {
                            "name": "天一村"
                        },
                        {
                            "name": "天二村"
                        }
                    ]
                },
                {
                    "name": "河北",
                }
            ]
        }

        function getChild(id, e, data) {
            //id, 当前select ID
            //e, 当前select选择项的索引
            //data, 当前节点的json数据
            let selectedItem = id.replace('organization', '') + '_' + e;
            selectedItem = selectedItem.split('_').join(',');
            if (selectedItem.substr(0, 1) == ',') {
                selectedItem = selectedItem.substr(1);
            }
            console.log(selectedItem);
            let selectArr = document.getElementById('selectOrg').getElementsByTagName('select');
            let level = id.split('_').length;
            for (let j = selectArr.length - 1; j > level - 1; j--) {
                document.getElementById('selectOrg').removeChild(selectArr[j]);
            }
            if (e != "-1") {
                if (data.children && data.children.length > 0) {
                    let temp = data.children;
                    let childItem = document.createElement('select');
                    childItem.id = id + '_' + e;
                    childItem.className = 'cbi-input-select';
                    if (window.addEventListener) {
                        childItem.addEventListener('change', function () { getChild(this.id, this.value, data.children[this.value]) }, false);
                    } else {
                        childItem.attachEvent('onchange', function () { getChild(this.id, this.value, data.children[this.value]) });
                    };
                    childItem.innerHTML = '<option value="-1">-- Please Select --</option>';
                    for (let i = 0; i < temp.length; i++) {
                        childItem.innerHTML += '<option value="' + i + '">' + temp[i].name + '</option>';
                    }
                    document.getElementById('selectOrg').appendChild(childItem);
                } else {
                    for (let j = selectArr.length - 1; j > level - 1; j--) {
                        document.getElementById('selectOrg').removeChild(selectArr[j]);
                    }
                }
            }

        }
    </script>
    <style type="text/css">
        #selectOrg select {
            margin-bottom: 0.7rem;
        }
    </style>
</head>

<body>
    <script type="text/javascript">
        let options = '';
        let level = organization.children;
        for (let i = 0; i < level.length; i++) {
            options += '<option value="' + i + '">' + level[i]["name"] + '</option>';
        }

        let initSection = `
    <div id="selectOrg">
    <select id="organization" type="text" class="cbi-input-select" value="" onchange="getChild(this.id,this.value,organization.children[this.value])">
    <option value="-1">-- Please Select --</option>
    ${options}
    </select>
</div>
    `;

        document.write(initSection);

    </script>

</body>

</html>