动态渲染实现三级地址的呈现

思路:绑定选择框的change事件,当选择框的值发生变化时,触发相应的处理函数(获取选择的省份值(转化成整数index)。根据index动态生成对应的城市选项,并添加到选择框中,然后清空,省、城市、区同理)。

以下是html代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #box {
            background-image: linear-gradient(0deg, rgb(236, 205, 225) 23.8%, #4ee8f3);
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            font-size: 30px;
            color: darkmagenta;
        }
    </style>
</head>

<body>
    <div id="box">
        <span>省</span>
        <select name="province" id="province">
            <option value="-1">请选择</option>
        </select>
        <span>市</span>
        <select name="city" id="city">
            <option value="-1">请选择</option>
        </select>
        <span>区</span>
        <select name="region" id="region">
            <option value="-1">请选择</option>
        </select>
    </div>

    <script src="https://code.jquery.com/jquery-3.7.0.js"></script>
    <script>
        $(function () {
            $.ajax({
                type: "get",
                url: "object.json",
                dataType: "json",
                success: function (data) {
                    /* 以下变量表示选择了省份、选择了市、选择了区后 */
                    var provinceSelect = $("#province");
                    var citySelect = $("#city");
                    var regionSelect = $("#region");
                    /* value = -1表示如果省份未选择之前都显示“请选择” */
                    provinceSelect.append("<option value='-1'>请选择</option>");
                    /* 遍历省份对象,+表示生成html代码,将每个省份作为option加入到请选择中 */
                    /* 索引是为了方便后续 */
                    $.each(data.province, function (index, province) {
                        provinceSelect.append("<option value='" + index + "'>" + province.name + "</option>");
                    });
                    /* 为省份选择框绑定一个change事件的处理函数 */
                    provinceSelect.on("change", function () {
                        /* 获取正在选择的省份索引值,将其转换为整数 */
                        var selectedProvinceIndex = parseInt($(this).val());
                        /* 清空城市选择框和区域选择框,(上一个省份剩下的),并在其中添加"请选择" */
                        citySelect.empty().append("<option value='-1'>请选择</option>");
                        regionSelect.empty().append("<option value='-1'>请选择</option>");
                        /* 省份选择成功,获取对象 */
                        if (selectedProvinceIndex >= 0) {
                            var selectedProvince = data.province[selectedProvinceIndex];
                            /* 遍历next属性(城市),同理添加到选择框中 */
                            $.each(selectedProvince.next, function (index, city) {
                                citySelect.append("<option value='" + index + "'>" + city.name + "</option>");
                            });
                        }
                    });
                    /* 同省份选择 */
                    citySelect.on("change", function () {
                        var selectedProvinceIndex = parseInt(provinceSelect.val());
                        var selectedCityIndex = parseInt($(this).val());
                        regionSelect.empty().append("<option value='-1'>请选择</option>");
                        /* 省份和城市都被选中时才触发区类 */
                        if (selectedProvinceIndex >= 0 && selectedCityIndex >= 0) {
                            var selectedProvince = data.province[selectedProvinceIndex];
                            var selectedCity = selectedProvince.next[selectedCityIndex];
                            $.each(selectedCity.next, function (index, region) {
                                regionSelect.append("<option value='" + index + "'>" + region.name + "</option>");
                            });
                        }
                    });
                },
                /* 不成功控制台显示 */
                error: function (errdata) {
                    console.log(errdata);
                }
            });
        });
    </script>
</body>

</html>

object.json代码:

{
    "province": [
        {
            "name": "浙江省",
            "next": [
                {
                    "name": "杭州市",
                    "next": [
                        {
                            "name": "萧山区"
                        },
                        {
                            "name": "滨江区"
                        },
                        {
                            "name": "西湖区"
                        }
                    ]
                },
                {
                    "name": "金华市",
                    "next": [
                        {
                            "name": "婺城区"
                        },
                        {
                            "name": "金东区"
                        },
                        {
                            "name": "开发区"
                        }
                    ]
                },
                {
                    "name": "温州市",
                    "next": [
                        {
                            "name": "鹿城区"
                        },
                        {
                            "name": "龙湾区"
                        },
                        {
                            "name": "洞头区"
                        }
                    ]
                }
            ]
        },
        {
            "name": "安徽省",
            "next": [
                {
                    "name": "合肥市",
                    "next": [
                        {
                            "name": "庐阳区"
                        },
                        {
                            "name": "瑶海区"
                        },
                        {
                            "name": "蜀山区"
                        }
                    ]
                },
                {
                    "name": "芜湖市",
                    "next": [
                        {
                            "name": "镜湖区"
                        },
                        {
                            "name": "鸠江区"
                        },
                        {
                            "name": "弋江区"
                        }
                    ]
                },
                {
                    "name": "淮北市",
                    "next": [
                        {
                            "name": "杜集区"
                        },
                        {
                            "name": "相山区"
                        },
                        {
                            "name": "烈山区"
                        }
                    ]
                }
            ]
        },
        {
            "name": "山东省",
            "next": [
                {
                    "name": "济南市",
                    "next": [
                        {
                            "name": "长清区"
                        },
                        {
                            "name": "章丘区"
                        },
                        {
                            "name": "济阳区"
                        }
                    ]
                },
                {
                    "name": "青岛市",
                    "next": [
                        {
                            "name": "黄岛区"
                        },
                        {
                            "name": "城阳区"
                        },
                        {
                            "name": "崂山区"
                        }
                    ]
                },
                {
                    "name": "淮北市",
                    "next": [
                        {
                            "name": "杜集区"
                        },
                        {
                            "name": "相山区"
                        },
                        {
                            "name": "烈山区"
                        }
                    ]
                }
            ]
        }
    ]
}

效果图如下:

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值