原生JS 实现 省市区的“三级联动”

3,838 阅读2分钟

JS实现三级联动

题目阐述

  • 题目:三级联动
    • 通过改动对省级下拉列表的选项值,
    • 同时改动对市级下拉列表的选项值和区级的下拉列表选项值,
    • 并且每个选项值都是符合上一级选项值管辖范围的。
    • 效果如下图:

三级联动.gif

思路解析

三级联动

  1. 将封装好的数据加入到省级下拉列表的项中
  2. 通过事件绑定,当省级项有变动,修改市级下拉列表项,
  3. 同时,区级下拉列表项数据也对应修改

代码示例

// 三级联动
<body>
    省:<select id="one">
        <option value="-1">请选择---</option>
    </select>
    市:<select id="two">
        <option value="-1">请选择---</option>
    </select>
    区:<select id="three">
        <option value="-1">请选择---</option>
    </select>

![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/01ce213fb5fc4f4bbe5bc9ea3169203d~tplv-k3u1fbpfcp-watermark.image)
    <script>
        var item = [{
            "name": "福建省",
            "child": [{
                "name": "福州市",
                "child": ["晋安区", "台江区"]
            }, {
                "name": "厦门市",
                "child": ["思明区", "海沧区"]
            }]
        },
        {
            "name": "广东省",
            "child": [{
                "name": "广州市",
                "child": ["天河区", "番禺区"]
            }, {
                "name": "深圳市",
                "child": ["深圳1区", "深圳2区"]
            }]
        }]
        //简单的三级联动
        var shen = document.getElementById("one");
        var shi = document.getElementById("two");
        var qu = document.getElementById("three");
        var op = document.createElement("option");


        var flag = 0;//标记省级位置
        for (var i in item) {
            // var opDate = op.cloneNode(true);
            // opDate.innerHTML = item[i].name;
            // shen.appendChild(opDate);
            var opDate = new Option(item[i].name, i);
            shen.appendChild(opDate);
        }

        //省级下拉列表改变触发事件
        shen.onchange = function () {
            //清除列表中的选项值
            shi.options.length = 0;
            qu.options.length = 0;
            //未选中任何省时,市级和区级都是待选状态
            if (this.value == -1) {
                var opti = "<option>请选择---</option>";
                shi.innerHTML = opti;
                qu.innerHTML = opti;
                return;
            }
             //添加省级对象下的市级对象
            for (var i in item[this.value].child) {
                var opDate = new Option(item[this.value].child[i].name, i);
                shi.appendChild(opDate);
            }
            flag = this.value;
             //市级下拉列表改变触发事件
             //清除列表中的选项值
             qu.options.length = 0;
            //添加省级对象下市级对象下的区
            for (var i in item[flag].child[this.value].child) {
                var opDate = new Option(item[flag].child[this.value].child[i]);
                qu.appendChild(opDate);
            }
            
        }

总结

数据是提前封装好的,如果地址数据是一个规律字符串;第一步要做的就是分解该字符串,让你更容易的获取到对应数据。