当前位置: 首页 > news >正文

Ajax来实现下拉框省市区三级联动效果(服务端基于express)

//服务端JS代码:
//提供服务端的处理
const express = require('express');
const fs = require('fs');
const app = express();

//载入选择城市的页面
app.get('/',function(req,res){
    res.sendFile( __dirname + "/7.city.html" );
});

//获取所有的省份
app.get('/province',function(req,res){
    //读取json文件
    fs.readFile('cityData.min.json','utf8',function(err,data){
        if (err) throw err;
        //data就是我们的整个json字符串,需要转成对象
        //console.log(data);
        //console.log(typeof data);
        var cityObj = JSON.parse(data);
        var province = [];
        cityObj.forEach(function(item){
            province.push(item.n);
        });
        //console.log(province);
        res.json(province);
    });
});

//获取指定省份的市区
app.get('/city',function(req,res){
    //获取传递过来的省份
    var province = req.query.province;
    fs.readFile('cityData.min.json','utf8',function(err,data){
        if (err) throw err;
        var cityObj = JSON.parse(data);
        //如何找到对应省份下面的市区呢?
        var city = [];
        cityObj.forEach(function(item){
            if (item.n == province) {
                //对item.s进行遍历,针对每个对象,取出其属性为n的那个值
                item.s.forEach(function(item1){
                    city.push(item1.n);
                });
            }
        });
        //console.log(city);
        res.json(city);
    });
});

//获取指定市区下面的所有区县
app.get('/country',function(req,res){
    var city = req.query.city;
    fs.readFile('cityData.min.json','utf8',function(err,data){
        if (err) throw err;
        var cityObj = JSON.parse(data);
        //如何找到对应省份下面的市区呢?
        var country = [];
        //难点在于如何找到对应的区县呢
        cityObj.forEach(function(item){
            //item就是每一个省份对象,需要对该对象的s属性【它是一个数组】,进行遍历
            item.s.forEach(function(item1){
                //item1是 一个二级的市区对象,需要对该对象的n属性,进行比较
                if (item1.n == city) {
                    if(item1.s==null){
                        country=[];
                    }else{
                        //此时,该对象的s属性中保存的这些对象的n属性就是我们要的结果,需要对s属性进行遍历
                        item1.s.forEach(function(item2){
                            //item2就是三级的区县对象,只需要获取n属性即可
                            country.push(item2.n);
                        });
                    }

                }
            });
        });
        console.log(country);
        res.json(country);
    });

});
app.listen(2015,function(){
    console.log('http server is listening localhsot in port 2015...');
});

  

<!--客户端页面代码-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h2>省市区三级联动</h2>
    <label for="">按省份选择:</label>
    <select name="" id="province">
        <option value="">--省份--</option>
    </select>
    <select name="" id="city">
        <option value="">--市--</option>
    </select>
    <select name="" id="country">
        <option value="">--区县--</option>
    </select>
    <script>
        //使用ajax获取所有的省份
        //第一步,创建xhr对象
        var xhr = new XMLHttpRequest();
        //第二步,需要建立和服务器的连接
        xhr.open('get','/province');
        //第三步,监听状态的变化
        xhr.onreadystatechange = function(){
            if (xhr.readyState == 4 && xhr.status == 200) {
                //可以接受返回数据
                var res = JSON.parse(xhr.responseText);
                //待定,稍后继续
                var str = " <option value=''>--省份--</option>";
                res.forEach(function(item){
                    str += "<option value='"+item+"'>"+item+"</option>";
                });
                //将str添加到select为province的下拉列表中
                document.getElementById('province').innerHTML = str;
            }
        }
        //第四步,发送数据
        xhr.send(null);

        //当触发省份的下拉框时,需要发送ajax请求,获取对应的市区
        var province = document.getElementById('province');
        province.onchange = function(){
            //发起请求
            xhr.open('get','/city?province='+this.value);
            //监听状态的变化
            xhr.onreadystatechange = function(){
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var res = JSON.parse( xhr.responseText);
                    var str = "<option value=''>--市--</option>";
                    res.forEach(function(item){
                        str += "<option value='"+item+"'>"+item+"</option>";
                    });
                    document.getElementById('city').innerHTML = str;
                }
            }
            //发送请求
            xhr.send(null);
        }

        //获取指定市区下面的区县
        var city = document.getElementById('city');
        city.onchange = function(){
            //发起请求
            xhr.open('get','/country?city='+this.value);
            //监听状态的变化
            xhr.onreadystatechange = function

(){
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var res = JSON.parse( xhr.responseText);
                    var str = "<option value=''>--区县--</option>";
                    res.forEach(function(item){
                        str += "<option value='"+item+"'>"+item+"</option>";
                    });
                    document.getElementById('country').innerHTML = str;
                }
            }
            //发送请求
            xhr.send(null);
        }
    </script>
</body>
</html>

  效果图:

转载于:https://www.cnblogs.com/yanxinhua/p/5820187.html

相关文章:

  • 登陆界面不输密码点一次登陆出现一个用户名和密码不能为空(点n个出现n个)...
  • 适合程序员的个人综合意外险,最高可保100万
  • 工业无线网络标准初步了解
  • 利用KVO监视一个view的frame
  • 操作系统的主要功能
  • ubuntu server 安装 mantis bug tracker 中文配置
  • String Format 的实现
  • 信息社会
  • 模板引擎Nvelocity实例
  • 闲聊产品】之三:点评 WWDC 2014
  • 判断Laravel Eloquent获取数据结果集是否为空
  • 具有先进的图像处理和图像识别技术的条码识别引擎2D Barcode Decoder DLL
  • HeadFirst 设计模式 04 工厂模式
  • WPF RichTextBox 做内容展示框 滚动条控制判定是否阅读完成
  • 迷你MVVM框架 avalonjs 沉思录 第3节 动态模板
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 4. 路由到控制器 - Laravel从零开始教程
  • Apache的80端口被占用以及访问时报错403
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • jquery cookie
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Linux gpio口使用方法
  • Python打包系统简单入门
  • React-生命周期杂记
  • Sass 快速入门教程
  • Solarized Scheme
  • Spring Cloud中负载均衡器概览
  • vue数据传递--我有特殊的实现技巧
  • 关于extract.autodesk.io的一些说明
  • 面试遇到的一些题
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 协程
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 用element的upload组件实现多图片上传和压缩
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​批处理文件中的errorlevel用法
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #{}和${}的区别是什么 -- java面试
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (1)SpringCloud 整合Python
  • (33)STM32——485实验笔记
  • (6)添加vue-cookie
  • (二)springcloud实战之config配置中心
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (十八)三元表达式和列表解析
  • (一)基于IDEA的JAVA基础10
  • .NET Core Web APi类库如何内嵌运行?
  • .NET 药厂业务系统 CPU爆高分析
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?