ajax+json经典综合案例--省市区街道地址选择

目录

纯jquery方式实现,地址数据来源与苏宁接口

select2插件方式实现,地址数据来源与苏宁接口 


纯jquery方式实现,地址数据来源与苏宁接口

首选需要选择省份

当为直辖市时,市不用选择会自动加载,并置灰不可改变。当街道为全区时,处于不可选状态。如下图所示 

当市下面的区唯一时,选择市后,区自动加载,并置灰。如下图所示

完整代码如下 :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>address</title>
    <script src="./js/jquery-3.3.1.js"></script>
    <style>
        select {
            width: 200px;
            height: 30px;
            border: 1px solid green;
        }
    </style>
</head>
<body>
<div class="container">
    <div><h3>请完善地址信息</h3></div>
    <div class="layui-m-layer " id="address">
        <select id="provice">
            <option selected="selected" value="请选择省" disabled="disabled">请选择省</option>
        </select>
        <select id="city">
            <option selected="selected" value="请选择市" disabled="disabled">请选择市</option>
        </select>
        <select id="district">
            <option selected="selected" value="请选择区/县" disabled="disabled">请选择区/县</option>
        </select>
        <select id="streets">
            <option selected="selected" value="请选择街道/镇" disabled="disabled">请选择街道/镇</option>
        </select>
    </div>
</div>
<script>
    $(function () {
        //先隐藏市、区、街道
        $("#city").hide();
        $("#district").hide();
        $("#streets").hide();
        //加载省份数据
        $.ajax({
            type: "get",
            url: "https://ipservice.suning.com/les/provinceList-callback.html",
            dataType: "jsonp",
            jsonpCallback: "callback",
            jsonp: "callback",
            success: function (data) {
                //获取所有的省份信息
                var proviceList = data.provinces;
                //开始填充省份信息到select下面的option中
                $.each(proviceList, function (i, val) {
                    // console.log(val);
                    $("#provice").append("<option value=" + val.commerceId + ">" + val.name + "</option>");
                })
            }
        });
        //监测省份值的改变,由此加载城市
        $("#provice").on("change", function (e) {
            $("#city").hide();
            $("#district").hide();
            $("#streets").hide();
            var proviceSelected = $(e.target).val()
            console.log($(e.target).val());
            $("#city").empty();
            // $("#city").empty().append("<option selected=\"selected\" value=\"请选择市\" disabled=\"disabled\">请选择市</option>");
            $.ajax({
                type: "get",
                url: "https://ipservice.suning.com/les/cityList-" + proviceSelected + "-callback.html",
                dataType: "jsonp",
                jsonpCallback: "callback",
                jsonp: "callback",
                success: function (data) {
                    //获取所有的省份信息
                    var cityList = data.cities;
                    $("#city").attr("disabled", false);
                    //开始填充省份信息到select下面的option中
                    $.each(cityList, function (i, val) {
                        // console.log(val);
                        $("#city").append("<option value=" + val.lesId + ">" + val.name + "</option>");
                    });
                    //判断城市是否只有一个值为直辖市
                    if (cityList.length > 1) {
                        //多个值,添加选择头option
                        $("#city").prepend("<option selected=\"selected\" value=\"请选择市\" disabled=\"disabled\">请选择市</option>");
                    } else {
                        //一个值,直接显示,并且使其不可用置灰
                        $("#city").attr("disabled", true);
                        $("#city").trigger("change");
                    }
                    $("#city").show();
                }
            });
        });
        //监测市值的改变,由此加载县区
        $("#city").on("change", function (e) {
            $("#district").hide();
            $("#streets").hide();
            var citySelected = $(e.target).val()
            console.log($(e.target).val());
            $("#district").empty();
            // $("#city").empty().append("<option selected=\"selected\" value=\"请选择市\" disabled=\"disabled\">请选择市</option>");
            $.ajax({
                type: "get",
                url: "https://ipservice.suning.com/les/districtList-" + citySelected + "-callback.html",
                dataType: "jsonp",
                jsonpCallback: "callback",
                jsonp: "callback",
                success: function (data) {
                    //获取所有的省份信息
                    var districtList = data.districts;
                    $("#district").attr("disabled", false);
                    //开始填充省份信息到select下面的option中
                    $.each(districtList, function (i, val) {
                        // console.log(val);
                        $("#district").append("<option value=" + val.cityLesId + ">" + val.name + "</option>");
                    });
                    if (districtList.length > 1) {
                        $("#district").prepend("<option selected=\"selected\" value=\"请选择县区\" disabled=\"disabled\">请选择县/区</option>");
                    } else {
                        $("#district").attr("disabled", true);
                        $("#district").trigger("change");
                    }
                    $("#district").show();
                }
            });
        });
        //监测区值的改变,由此加载街道/镇
        $("#district").on("change", function (e) {
            $("#streets").hide();
            var streetSelected = $(e.target).val();
            console.log($(e.target).val());
            $("#streets").empty();
            if (streetSelected != null && streetSelected.trim().length > 0) {
                var streePrev = streetSelected.substring(0, 3);
                var streeLast = streetSelected.substring(3);
                // $("#city").empty().append("<option selected=\"selected\" value=\"请选择市\" disabled=\"disabled\">请选择市</option>");
                $.ajax({
                    type: "get",
                    url: "https://ipservice.suning.com/les/streetList-" + streePrev + "-" + streeLast + "-callback.html",
                    dataType: "jsonp",
                    jsonpCallback: "callback",
                    jsonp: "callback",
                    success: function (data) {
                        //获取所有的省份信息
                        var streetList = data.streets;
                        $("#streets").attr("disabled", false);
                        //开始填充省份信息到select下面的option中
                        $.each(streetList, function (i, val) {
                            // console.log(val);
                            $("#streets").append("<option value=" + val.districtLesId + ">" + val.name + "</option>");
                        });
                        if (streetList.length > 1) {
                            $("#streets").prepend("<option selected=\"selected\" value=\"请选择街道/镇\" disabled=\"disabled\">请选择街道/镇</option>");
                        } else {
                            $("#streets").attr("disabled", true);
                        }
                        $("#streets").show();
                    }
                });
            }
        });
    })
</script>
</body>
</html>

select2插件方式实现,地址数据来源与苏宁接口 

select2插件带有搜索功能

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>address</title>
    <link rel="stylesheet" href="./css/select2.min.css">
    <script src="./js/jquery-3.3.1.js"></script>
    <script src="./js/select2/js/select2.full.js"></script>
    <script src="./js/select2/js/i18n/zh-CN.js"></script>
</head>
<body>
<div class="container">
    <div><h3>请填写地址信息:</h3></div>
    <div id="addrDiv">
        <select id="provices">
            <option></option>
        </select>
        <select id="citys">
            <option></option>
        </select>
        <select id="districts">
            <option></option>
        </select>
        <select id="streets">
            <option></option>
        </select>
    </div>
</div>
<script>
    $(function () {
          $("#citys").hide();
          $("#districts").hide();
          $("#streets").hide();
        //首先加载所有省份
        $.ajax({
            type: "get",
            url: "https://ipservice.suning.com/les/provinceList-callback.html",
            dataType: "jsonp",
            jsonp: "callback",
            jsonpCallback: "callback",
            success: function (data) {
                console.log(data);
                var proviceList = data.provinces;
                var proviceListSelect2 = [];
                for (var key in proviceList) {
                    //将数据重新封装成select2需要的格式
                    proviceListSelect2.push({id: proviceList[key].commerceId, text: proviceList[key].name});
                }
                $("#provices").select2({
                    placeholder: "请选择省",
                    language: "zh-CN",
                    width: 200,
                    data: proviceListSelect2
                })

            }
        });
        //省份值改变后,加载citys
        $("#provices").change(function () {
            //清空市区街道
            $("#citys").empty();
            $("#districts").empty();
            $("#streets").empty();
            //隐藏市区街道
            $("#citys+span").hide();
            $("#districts+span").hide();
            $("#streets+span").hide();
            //获取改变的值
            var proviceSet = $("#provices option:selected").val();
            console.log("选中的省的id:" + proviceSet);
            $.ajax({
                type: "get",
                url: "https://ipservice.suning.com/les/cityList-" + proviceSet + "-callback.html",
                dataType: "jsonp",
                jsonp: "callback",
                jsonpCallback: "callback",
                success: function (data) {
                    console.log(data);
                    var cityList = data.cities;
                    var cityListSelect2 = []
                    for (var key in cityList) {
                        //将数据重新封装成select2需要的格式
                        cityListSelect2.push({id: cityList[key].lesId, text: cityList[key].name});
                    }
                    $('#citys').attr("disabled", false);
                    
                    if (cityListSelect2.length == 1) {
                        $('#citys').attr("disabled", true);
                        $("#citys").trigger("change", {data: cityListSelect2[0].id});
                    } else {
                        $("#citys").prepend("<option></option>");
                    }
                    $("#citys").select2({
                        placeholder: "请选择市",
                        language: "zh-CN",
                        width: 200,
                        data: cityListSelect2
                    });
                }
            });
        })
        //城市改变,加载区
        $("#citys").change(function (e, data) {
            //隐藏区、街道
            $("#districts+span").hide();
            $("#streets+span").hide();
            //获取改变的值两种方式
            var citysSelected;
            if (data == undefined) {
                citysSelected = $("#citys  option:selected").val();
            } else {
                citysSelected = data.data;
            }

            console.log("选中的市的id:" + citysSelected);
            $.ajax({
                type: "get",
                url: "https://ipservice.suning.com/les/districtList-" + citysSelected + "-callback.html",
                dataType: "jsonp",
                contentType: "text/javascript;charset=UTF-8",
                jsonp: "callback1",
                jsonpCallback: "callback",
                success: function (data) {
                    console.log(data);
                    var districtList = data.districts;
                    var districtsListSelect2 = []
                    for (var key in districtList) {
                        //将数据重新封装成select2需要的格式
                        districtsListSelect2.push({
                            id: districtList[key].cityLesId
                            , text: districtList[key].name
                        });
                    }
                    $("#districts").empty();
                    $('#districts').attr("disabled", false);
                    if (districtsListSelect2.length == 1) {
                        $('#districts').attr("disabled", true);
                        $("#districts").trigger("change", {data: districtsListSelect2[0].id});
                    } else {
                        $("#districts").prepend("<option></option>");
                    }
                    $("#districts").select2({
                        placeholder: "请选择县/区",
                        language: "zh-CN",
                        width: 200,
                        data: districtsListSelect2
                    })

                }
            });
        })

        //区改变,加载街道
        $("#districts").change(function (e, data) {
            $("#streets+span").hide();
            //获取改变的值
            var streetsSelected;
            console.log("传参data:" + data);
            if (data == undefined || data == null) {
                streetsSelected = $("#districts  option:selected").val();
            } else {
                streetsSelected = data.data;
            }
            console.log("选中的区的id:" + streetsSelected);
            //剪切参数
            var streeSelect2Prev = streetsSelected.substring(0, 3);
            var streeSelect2Last = streetsSelected.substring(3);
            $.ajax({
                type: "get",
                url: "https://ipservice.suning.com/les/streetList-" + streeSelect2Prev + "-" + streeSelect2Last + "-callback.html",
                dataType: "jsonp",
                contentType: "text/javascript;charset=UTF-8",
                jsonp: "callback2",
                jsonpCallback: "callback",
                success: function (data) {
                    console.log(data);
                    var streetList = data.streets;
                    var streetListSelect2 = []
                    for (var key in streetList) {
                        //将数据重新封装成select2需要的格式
                        streetListSelect2.push({
                            id: streetList[key].districtLesId
                            , text: streetList[key].name
                        });
                    }
                    $("#streets").empty();
                    $('#streets').attr("disabled", false);
                    if (streetListSelect2.length == 1) {
                        $('#streets').attr("disabled", true);
                    } else {
                        $("#streets").prepend("<option></option>")
                    }
                    $("#streets").select2({
                        placeholder: "请选择街道",
                        language: "zh-CN",
                        width: 200,
                        data: streetListSelect2
                    });
                }
            });
        })
    })
</script>

</body>
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现省市区三级联动的关键是建立好数据库,并且编写好对应的 SQL 语句。以下是一个简单的数据库设计: - 省份表 province,包括字段 id 和 name。 - 城市表 city,包括字段 id、name 和省份的外键 province_id。 - 区县表 district,包括字段 id、name 和城市的外键 city_id。 接下来是建表语句: ```sql -- 省份表 CREATE TABLE `province` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 城市表 CREATE TABLE `city` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `province_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `province_id` (`province_id`), CONSTRAINT `city_ibfk_1` FOREIGN KEY (`province_id`) REFERENCES `province` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 区县表 CREATE TABLE `district` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `city_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `city_id` (`city_id`), CONSTRAINT `district_ibfk_1` FOREIGN KEY (`city_id`) REFERENCES `city` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 接下来是查询省份、城市、区县的 SQL 语句: ```sql -- 查询所有省份 SELECT id, name FROM province; -- 查询某个省份下的所有城市 SELECT id, name FROM city WHERE province_id = ?; -- 查询某个城市下的所有区县 SELECT id, name FROM district WHERE city_id = ?; ``` 在 Java Web 项目中,可以使用 AjaxJSON 技术实现省市区三级联动。前端页面发送 Ajax 请求,后端通过 JDBC 连接数据库,查询对应的省份、城市、区县信息,并以 JSON 格式返回给前端页面。前端页面再解析 JSON 数据,更新页面的省份、城市、区县下拉框选项。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值