首先,页面用服务器端渲染,拿到省份信息,渲染到页面
其次,客户端省份信息选择之后调用城市接口,获取数据,渲染到页面,注意,(1)在客户端没有选中时让城市的下拉框清空,避免省份还在提示请选择省份时,城市诓就有信息(2)省份框选中时,让县城框清空,同样,避免还未选城市呢,县城信息就出来
然后,选择了城市之后,调接口用数据渲染县城框
//导入省份,城市,area数据模块
const {Province} = require('../model/addrSelectPro');
const {City} = require('../model/addrSelectCity');
const {Area} = require('../model/addrSelectArea');
//// 一开始就请求省份,渲染到页面
app.get('/addrSelectPro',async (req,res)=>{
// 获取所有省份的信息
var provinceArry = await Province.find();
//渲染index.art模板
res.render('index',{provinceArry});
});
//请求城市信息
app.get('/addrSelectCity/:province',async (req,res)=>{
// 获取请求参数省份名称
var {province} = req.params;
// 查询省份具体的信息
var proInfo = await Province.findOne({province:province});
// 根据省份id查城市信息
var cityArry = await City.find({province:proInfo._id});
//将城市数据传回,注意我传的时对象
res.send({cityArry});
}
// 请求县城信息
app.get('/addrSelectArea/:city', async (req,res)=>{
// 获取参数城市名
var {city} = req.params;
// 查询城市对应的信息以便获取城市id
var cityInfo = await City.findOne({city:city});
// 根据城市id查县城信息
var areaArry = await Area.findOne({city:cityInfo._id});
//将县城数据传回,注意我传的时对象
res.send({areaArry});
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<select name="province" id="provinceBox" class="form-control">
<option>请选择省份</option>
{{each provinceArry}}
<option value="{{$value.province}}">{{$value.province}}</option>
{{/each}}
</select>
<select name="city" id="cityBox">
<option>请选择城市</option>
</select>
<select name="area" id="areaBox" class="form-control">
<option >请选择县城</option>
</select>
<script src="/js/template-web.js"></script>
<script src="/js/jquery.js"></script>
// 下拉显示城市地址模块
<script id="cityTpl" type="text/html">
<option>请选择城市</option>
<% for(var i=0;i< cityArry.length;i++){%>
<option value="<%=cityArry[i].city%>"><%=cityArry[i].city%></option>
<%}%>
</script>
// 下拉显示县城地址模块
<script id="areaTpl" type="text/html">
<option>请选择城市</option>
<% for(var i=0;i< areas.length;i++){%>
<option value="<%=areas[i]%>"><%=areas[i]%></option>
<%}%>
</script>
//导入页面的js代码
<script src="/js/test.js"></script>
</body>
</html>
// 省份盒子点击时,清空城市盒子(省份盒子未发生change事件的处理)
$('#provinceBox').on('click',function(){
var province = $('#provinceBox').val();
// 清空城市下拉框,也就是让城市的渲染数据为空数据就行
var html = template('cityTpl', {
cityArry: []
});
$('#cityBox').html(html);
});
// 城市box的事件
$('#provinceBox').on('change',function(){
// 获取当前选择的省份
var province = $('#provinceBox').val();
console.log(province);
// 清空县城下拉框,也就是让县城的渲染数据为空数据就行
var html = template('areaTpl', {
areas: []
});
$('#areaBox').html(html);
$.ajax({
type:'get',
url:'/home/addrSelectCity/'+province,
success:function(response){
var {cityArry} = response;
var html = template('cityTpl',{
cityArry
})
$('#cityBox').html('');
$('#cityBox').html(html);
}
})
})
// 县城box的事件
$('#cityBox').on('change',function(){
// 获取当前选择的省份
var city = $('#cityBox').val();
$.ajax({
type:'get',
url:'/home/addrSelectArea/'+city,
success:function(response){
var {areaArry} = response;
console.log(areaArry.areas);
var html = template('areaTpl',{
areas:areaArry.areas
})
$('#areaBox').html('');
$('#areaBox').html(html);
}
})
})
const mongoose = require('mongoose');
// 创建规则
const addrSelectProSchema = new mongoose.Schema({
province:{
type:String,
required:true
}
})
// 创建省份集合
const Province = mongoose.model('Province',addrSelectProSchema);
//导出模块
module.exports = {
Province
}
const mongoose = require('mongoose');
// 创建规则
const addrSelectCitySchema = new mongoose.Schema({
province:{
type:mongoose.Schema.Types.ObjectId,
ref:'Province',
required:true
},
city:{
type:String,
required:true
}
})
//创建城市集合
const City = mongoose.model('City',addrSelectCitySchema);
//导出模块
module.exports = {
City
}
const mongoose = require('mongoose');
// 创建规则
const addrSelectAreaSchema = new mongoose.Schema({
city:{
type:mongoose.Schema.Types.ObjectId,
ref:'City',
required:true
},
areas:{
type:[],
required:true
}
})
//创建县城集合
const Area = mongoose.model('Area',addrSelectAreaSchema);
//导出模块
module.exports = {
Area
}
今天的这篇博客我个人觉得很完整了,希望大家可以从中学习到东西,汝以我而得获,其余而喜之也!哈哈