//服务端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>

  效果图:

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

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

    原始的下拉框不好看这里推荐一个jQuery自定义漂亮的下拉框插件8种效果演示 在线预览 下载地址 实例代码 <!DOCTYPE html> <html lang="en&q ...

  2. jQuery下拉框插件8种效果

    jQuery自定义漂亮的下拉框插件8种效果 jquery美化选择器实例有:边框.下划线. 伸缩 .滑动. 覆盖. 旋转. 弹出层选择 .环形效果. 在线预览 <body class=" ...

  3. js下拉框二级关联菜单效果代码具体实现

    这篇文章介绍了js下拉框二级关联菜单效果代码具体实现,有需要的朋友可以参考一下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...

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

    html代码: 控制器代码: 其中的<option value="{$vo.gradeId}">{$one.gradeName}</option> 在操作过 ...

  5. Combobox下拉框两级联动

    下拉框的两级联动是我们开发中经常遇到一种情况.比如一个学生管理系统中,根据年级.科目及姓名查询学生考试成绩,年级和科目都是硬盘中的有限数据(数据库)而学生则可以有用户手动指定,这时在数据库中有年级和科 ...

  6. css之实现下拉框自上而下展开动画效果&&自下而上收起动画效果

    HTML代码: <div className={CX('font-size-selector-sub-list', { show: shouldSubListShow === true, hid ...

  7. 用Vue2仿京东省市区三级联动效果

    三级联动,随着越来越多的审美,出现了很多种,好多公司都仿着淘宝的三级联动 ,好看时尚,so我们公司也一样……为了贴代码方便,我把写在data里面省市区的json独立了出来,下载贴进去即可用,链接如下 ...

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

    HTML代码: @{ Layout = null; } @using DAL; @using System.Data; @{ AreaDal areaDal = new AreaDal(); stri ...

  9. (webapp)微信和safri 对于html5 部分功能不兼容,多选或单选下拉框去除边框无效果。

    1 appearance:none; 2 -moz-appearance:none; /* Firefox */ 3 -webkit-appearance:none; /* Safari 和 Chro ...

随机推荐

  1. pygame事件之——控制物体(飞机)的移动

    近来想用pygame做做游戏,在 xishui 大神的目光博客中学了学这东西,就上一段自己写的飞机大战的代码,主要是对键盘控制飞机的移动做了相关的优化 # -*- coding: utf-8 -*- ...

  2. gradle入门(1-6)将Java项目从maven迁移到gradle

    gradle项目与maven项目相互转化(转) 转自: http://www.cnblogs.com/yjmyzz/p/gradle-to-maven.html 一.maven项目->gradl ...

  3. 九、Python+Selenium模拟用QQ登陆腾讯课堂,并提取报名课程(练习)

    研究QQ登录规则的话,得分析大量Javascript的加密解密,比较耗时间.自己也是练习很少,短时间成功不了.所以走了个捷径. Selenium是一个WEB自动化测试工具,它运行时会直接实例化出一个浏 ...

  4. jQuery serialize()方法获取不到数据,alert结果为空

    网上查找,问题可能是 id有重复 经排查,没有发现重复id 解决方案 form表单中每个input框都没有name属性,添加name属性即可 若name属性与jQuery的关键字有冲突,也可导致该问题 ...

  5. fetch简明学习

    前面的话 Fetch API 提供了一个 JavaScript接口,用于访问和操纵HTTP管道的部分,例如请求和响应.它还提供了一个全局 fetch()方法,该方法提供了一种简单,合乎逻辑的方式来跨网 ...

  6. POJ-1556 The Doors---线段相交+最短路

    题目链接: https://vjudge.net/problem/POJ-1556 题目大意: 给一个10*10的正方形房间中间用墙隔开每个墙上有两个门,给出门的两个端点坐标求从左边中点走到右边中点所 ...

  7. java内部类、接口、集合框架、泛型、工具类、实现类

    .t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.内部类 1.成员内部类. (1)成员内部类的实例化: 外部类名.内部类 ...

  8. 【SQL.基础构建-第二节(2/4)】

    --      Tips:查询基础 --一.SELECT 语句基础-- 1.查询指定列:SELECT 关键字--语法:--SELECT <列名>, ...     -- 希望查询列的名称- ...

  9. 众说纷纭的ul、ol、li

    (1)提到ul ol li,大家都知道,就是三个列表标签,ul表示无需列表(unordered list),ol表示有序列表(oredr list), li 表示列表项(list item),之前我也 ...

  10. css中单位px,em,rem和vh/vw的理解

    >px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的. em是相对长度单位.相对于当前对象内文本的字体尺寸.如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认 ...