省市区三级联动

省市区三级联动

html代码
<!-- 省 -->
<select id="province">
    <option selected>--请选择--</option>
</select>
<!-- 市 -->
<select id="city">
    <option selected>--请选择--</option>
</select>
<!-- 区/县去 -->
<select id="region">
    <option selected>--请选择--</option>
</select>
js代码
<script>
	//定义三个数	
	//一维数组表示 省
    var arr1 = ["湖南省", "江西省", "广东省", "北京"];
    //二维数组表示 市
    var arr2 = [
        ["长沙市", "湘潭市", "株洲市", "衡阳市"],
        ["南昌市", "赣州市", "九江市"],
        ["广州市", "深圳市", "佛山市"],
        ["北京"]
    ];
    //三维数组表示 区县
    var arr3 = [
        [
            ["岳麓区", "芙蓉区", "望城区"],
            ["雨湖区", "湘潭县", "韶山市"],
            ["天元区", "芦淞区", "炎陵县","攸县"],
            ["南岳区", "珠晖区", "祁东县"]
        ],
        [
            ["新建区", "东湖区", "西湖区"],
            ["赣县区", "章贡区"],
            ["修水县", "浔阳区", "武宁县"]
        ],
        [
            ["天河区", "白云区", "海珠区"],
            ["罗湖区", "龙岗区", "盐田区"],
            ["三水区", "顺德区", "高明区"]
        ],
        [
            ["丰台区", "海淀区", "朝阳区"]
        ]
    ];
    //(不难看出有的省对应的市或区县,长度也有所不同)
</script>

三维数组 中值的对应关系:
在这里插入图片描述

写法一

js写法:(当省发生改变,动态添加市;当市发生改变,动态添加区县)

<script>
	for (const x in arr1) { //for in 循环 x表示下标  arr1表示需要遍历的对象
        province.appendChild(document.createElement("option"));
        province.lastChild.innerHTML = arr1[x];
    }

    province.onchange = function() {
        city.options.length = 1; //初始化  即下拉框默认显示第一个选项->  --请选择-- 
        region.options.length = 1; //初始化  
        for (const x in arr1) {
            if (this.value == arr1[x]) {
                for (const y in arr2[x]) {
                    city.appendChild(document.createElement("option"));
                    city.lastChild.innerHTML = arr2[x][y];
                }
            }
        }
    }

    city.onchange = function() { //当城市下拉框发生改变时:
        region.options.length = 1; //初始化 清空县/区的值
        for (const x in arr1) { //for-in(可以获取下标) 遍历json1数组中的值(省)
            for (const y in arr2[x]) { //················ 遍历json2数组中对应 省 的值(市)
                if (this.value == arr2[x][y]) { //当选中的城市 等于 遍历的城市时 就等于拿到了城市所在的“下标”
                    for (const z in arr3[x][y]) { //·················  遍历json3数组中对应 省及市 的值(县/区)
                        region.appendChild(document.createElement("option")); //给region(县/区)下拉框添加option标签(元素) 个数等于遍历json3数组的次数
                        region.lastChild.innerHTML = arr3[x][y][z]; //每添加一个option标签 就给这个标签设置初始值 这个值是从前面获取的“下标”来确定的
                    }
                }
            }
        }
    }
</script>        
写法二

jQuery进阶写法:(当省发生改变,市默认选中第一个,区县也默认选中第一个)

<script>
	//遍历arr1中的值,并添加相应的 省
	$.each(arr1, function(i, v) {
        $("#province").append("<option value='" + v + "'>" + v + "</option>");
    });
	//当省的下拉框发生改变时 动态添加市中的值,并默认选中第一个
	//此时默认选中市 这个操作也算市的下拉框发生改变,所以同样需要 动态添加区县中的值,并默认选中第一个
    $("#province").change(function() {
        $("#city")[0].options.length = 1;
        $("#region")[0].options.length = 1;
        let province = $(this).val();
        $.each(arr1, function(i, v1) {
            if (v1 == province) {
                $.each(arr2[i], function(j, v2) {
                    if (j == 0) {//下标为0时添加一个selected属性 让其默认被选中
                        $("#city").append("<option value='" + arr2[i][j] + "' selected>" + arr2[i][j] + "</option>");
                    } else {
                        $("#city").append("<option value='" + arr2[i][j] + "'>" + arr2[i][j] + "</option>");
                    }
                });
            }
        });
        $("#city").change();//手动调用城市下拉框的onchange事件
    });

    $("#city").change(function() {
        $("#region")[0].options.length = 1;
        let city = $(this).val();
        $.each(arr1, function(i, v1) {
            $.each(arr2[i], function(j, v2) {
                if (v2 == city) {
                    $.each(arr3[i][j], function(k, v3) {
                        if (k == 0) {
                            $("#region").append("<option value='" + arr3[i][j][k] + "' selected>" + arr3[i][j][k] + "</option>")
                        } else {
                            $("#region").append("<option value='" + arr3[i][j][k] + "'>" + arr3[i][j][k] + "</option>")
                        }
                    });
                }
            });
        });
    });
</script>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值