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>

  效果图:

时间: 2024-10-12 19:27:25

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

jQuery自定义漂亮的下拉框插件8种效果演示

原始的下拉框不好看这里推荐一个jQuery自定义漂亮的下拉框插件8种效果演示 在线预览 下载地址 实例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 <!DOCTYPE html> <html lang="en" class=

使用ajax实现城市下拉框

在博客园学习了很多实用的东西,现在该慢慢开始自己写写博客文章, 由于本人水平有限,刚走出校园的小菜鸟,另外,文章在表述和代码方面如有不妥之处,欢迎批评指正.留下你 的脚印,欢迎评论! 有什么问题,可以互相探讨,希望对各位有所帮助.开始讲东西吧 一个现实城市下拉框的界面 html代码: <table> <tr> <td><h5>城市下拉框</h5></td> <td> <select id="selNatio

ajax 遍历select 下拉框

html :<select id="type"   > </select> js代码: <script type="text/javascript">  //动态绑定下拉框项          function addnotice() {              $.ajax({                  url: "${pageContext.request.contextPath}/dictionary/j

ThinkPHP中ajax绑定select下拉框无法显示

html代码: 控制器代码: 其中的<option value="{$vo.gradeId}">{$one.gradeName}</option> 在操作过程中无法自动填充,下拉框有位置,却无法填充数据库的原因是 数据库的命名统一 一致,不能使用驼峰命名法来命名数据库的表的名字. 可以使用下划线,横线来命名表.

下拉框两级联动

//1.首先获取第一级菜单选中的值 第一级菜单id=select1 var val = $("#select1 option:selected").val() //2.如果第一级下拉框的值改变 $("#select1").change(function(){ //3.清楚第二级下拉框的数据 第二级下拉框的id=select2 $("#select2 > option").each(function(){ i++; if(i==1) retu

自建List&lt;&gt;绑定ComboBox下拉框实现省市联动

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace _04省市联动 { public partial cl

学习笔记——下拉框实现左右联动

先看一下效果图 然后是代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title> new do

Combobox下拉框两级联动

下拉框的两级联动是我们开发中经常遇到一种情况.比如一个学生管理系统中,根据年级.科目及姓名查询学生考试成绩,年级和科目都是硬盘中的有限数据(数据库)而学生则可以有用户手动指定,这时在数据库中有年级和科目两张表,每门科目都对应一个年级,所以我们可以用两个下拉框(Combobox)来存储年级和科目信息来供用户选择.界面如下: 这时如果我们将科目对应的下拉框直接绑定科目表时,用户选择一个年级后还要从所有科目中进行选择就会降低系统的友好性,甚至可能出现没有任何意义的查询语句.我们可以先绑定年级下拉框的数

jQuery Ajax实现下拉框无刷新联动

HTML代码: @{ Layout = null; } @using DAL; @using System.Data; @{ AreaDal areaDal = new AreaDal(); string areaId = ViewBag.areaId; DataRow drArea = areaDal.GetArea(areaId); string countyId = drArea == null ? "-1" : drArea["countyId"].ToSt