Ajax学习案例二之省市区三级联动

省市区三级联动

注:

1.以下代码我把key值省略了,如需使用到网站申请即可。
2.Ajax封装的函数见我第三天写的博客,链接在这(https://blog.csdn.net/qq_43709292/article/details/104137293)。
3.最开始怎么试都不行,发现有一个跨域的问题需要解决,解决参照这篇博文(https://blog.csdn.net/dadadashixiong/article/details/79978988),可能我是本地的环境,要访问那个api才出现的问题。

接口选择腾讯位置服务的接口,见链接(https://lbs.qq.com/webservice_v1/guide-region.html),这是本人第一次学习接口的使用,如果有错误的地方,欢迎指出!

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"
        integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
    <style type="text/css">
        .container {
            padding-top: 150px;
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="form-inline">
            <div class="form-group">
                <select class="form-control" id="province">
                </select>
            </div>
            <div class="form-group">
                <select class="form-control" id="city">
                    <option>请选择城市</option>
                </select>
            </div>
            <div class="form-group">
                <select class="form-control" id="area">
                    <option>请选择县城</option>
                </select>
            </div>
        </div>
    </div>

    <script src="./Ajax封装完成函数.js"></script>
    <script src="./template-web.js"></script>
    <!-- 准备好省份模板 -->
    <script type="text/html" id="provinceTpl">
        <option>请选择省份</option>
        <!-- 循环数据 把数据拼接到html代码中 -->
        {{each province}}
            <option value="{{$value.id}}">{{$value.name}}</option>
        {{/each}}
    </script>
    <!-- 准备好城市模板 -->
    <script type="text/html" id="cityTpl">
        <option>请选择城市</option>
        <!-- 循环数据 把数据拼接到html代码中 -->
        {{each city}}
            <option value={{$value.id}}>{{$value.name}}</option>
        {{/each}}
    </script>
    <!-- 准备好县城模板 -->
    <script type="text/html" id="areaTpl">
        <option>请选择县城</option>
        <!-- 循环数据 把数据拼接到html代码中 -->
        {{each area}}
            <option value={{$value.id}}>{{$value.fullname}}</option>
        {{/each}}
    </script>
    <script>
        // 获取省市区下拉框元素
        var province = document.getElementById('province');
        var city = document.getElementById('city');
        var area = document.getElementById('area');
        // 获取省份信息
        ajax({
            type: 'get',
            url: 'https://apis.map.qq.com/ws/district/v1/list',
            data: {
                key: '这里填写从接口处获得的key值'
            },
            success: function (data) {
                //将模板与数据进行拼接
                var html = template('provinceTpl', { province: data.result[0] });
                //将拼接好的html字符串添加到页面中
                province.innerHTML = html;
            },
            error: function (data) {
                console.log(data.message);
            }
        });
        //对省份添加发生改变事件
        province.onchange = function () {
            //获取省份id 用此id来查找此省份下的县城
            var pid = this.value;
            //清空县城下拉框中的数据
            var html = template('areaTpl', { area: [] });
            area.innerHTML = html;
            //清空城市下拉框中的数据
            var html = template('cityTpl', { city: [] });
            city.innerHTML = html;
            //获取城市信息
            ajax({
                type: 'get',
                url: 'https://apis.map.qq.com/ws/district/v1/getchildren',
                data: {
                    key: '这里填写从接口处获得的key值',
                    id: pid
                },
                success: function (data) {
                    //将模板与数据进行拼接
                    var html = template('cityTpl', { city: data.result[0] });
                    //将拼接好的html字符串添加到页面中
                    city.innerHTML = html;
                },
                error: function (data) {
                    console.log(data.message);
                }
            });
        }
        //对城市添加发生改变事件
        city.onchange = function () {
            //获取城市id
            var pid = this.value;
            //清空县城下拉框中的数据
            var html = template('areaTpl', { area: [] });
            area.innerHTML = html;
            //获取县城信息
            ajax({
                type: 'get',
                url: 'https://apis.map.qq.com/ws/district/v1/getchildren',
                data: {
                    key: '这里填写从接口处获得的key值',
                    id: pid
                },
                success: function (data) {
                    //将模板与数据进行拼接
                    var html = template('areaTpl', { area: data.result[0] });
                    //将拼接好的html字符串添加到页面中
                    area.innerHTML = html;
                },
                error: function (data) {
                    console.log(data.message);
                }
            });
        }
    </script>
</body>

</html>

在写这个代码的时候,有几个地方值得注意一下,一是那个$value 代表的是循环过程中的当前项,要注意;二是省份 城市 县城的模板要循环对应的数据,见上方代码,注意写的格式即可。大致思路我总结一下:

  1. 获取三个下拉框的元素;
  2. 通过list接口获取省份信息,通过模板引擎将省份信息拼接到下拉框中;
  3. 对省份下拉框添加 onchange 事件,并且每一次省份改变后,清空城市和县城的下拉框,之后通过 getchildren 接口通过用省份的 id 获取对应城市,并用模板引擎添加到页面中;
  4. 对城市下拉框添加 onchange 事件,并且每一次城市改变后,清空县城下拉框,之后通过 getchildren 接口用城市 id 获取对应的乡镇,并用模板引擎添加到页面中。
发布了28 篇原创文章 · 获赞 22 · 访问量 1922

猜你喜欢

转载自blog.csdn.net/qq_43709292/article/details/104149841
今日推荐