整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

原生JS简单快速实现省市区三级联动(含行政代码cod

原生JS简单快速实现省市区三级联动(含行政代码code)

备工作

省市区三级联动所需文件:评论回复区

文件说明:

整个文件为一个大的对象(非数组类型)

其中对象的属性名 100000 中包含所有省份,它也是一个对象格式的;

对象名为100000的每个属性中的属性名都为数字类型(其实是该地区的行政代码)。数字属性名对应的属性值是该地区的名称,同时也可以通过该属性名访问到它下级的市列表。

eg:

			import districts from './js/districts.js'
			console.log(districts[100000])

比如当我们想获取到行政代码130000河北省下面的市级列表时:

			import districts from './js/districts.js'
			console.log(districts[130000])

然后当我们想获得行政代码130100石家庄市下的区级列表时:

			import districts from './js/districts.js'
			console.log(districts[130100])

没错,省市中的每一个行政代码属性名都对应着它下一级(省行政代码对应市列表,市行政代码对应区列表)的对象列表。不存在数组对象嵌套。及其简单方便。

创建 option 标签简便API

new Option('innerText', 'value属性对应的值')

类似于传统写法:

let option_1=document.createElement('option')

option_1.text='innerText'

option_1.value='value属性对应的值'

嗯,没什么区别,但是第一种简单很多:

清空 select标签中的option标签极简方法:

selectDOM.options.length=0

.html文件中使用模块化

script 标签改为 type 属性改为 module <script type="module">

创建三个 select标签,分别用来存放 省级列表,市级列表,区级列表,并定义好变量:

HTML:

		<!-- 省级列表 -->
		<select id="province"></select>
		<!-- 市级列表 -->
		<select id="city"></select>
		<!-- 区级列表 -->
		<select id="area"></select>

JS:

			// 获取省市区selectDOM节点
			let oProvince=document.getElementById('province')
			let oCity=document.getElementById('city')
			let oArea=document.getElementById('area')

定义一个特定对应,用户将用户选中的结果获取到:

			let data={
				province: {},
				city: {},
				area: {}
			}

第一步,渲染省份列表

1,引入省市区文件 import districts from './js/districts.js'

直接一个for in 循环 districts[100000] 即可;

然后在循环中创建option标签,并插入到省级select节点中:

			let provinceList=districts[100000] 
			for (let province in provinceList) {
				oProvince.options.add( new Option(provinceList[province], province) )
			}

效果:

这样我们的第一个select标签就完成了

第二步,渲染市级列表

ps: 市级列表市基于省级之后才开始渲染的,所以应该在省级select改变之后触发(onchange事件)

1,首先拿到用户选中的是第几个option;

通过selectDOM的selectedIndex可拿到对应索引值:

然后通过children获取option子元素列表,之后直接拿对应索引即可!

eg: this.children[this.selectedIndex], 因为是onChange事件,this指代selectDOM。

在操作之前,可以先把用户选中的省份数据存放在我们提前定义好的data对象中的province对象中:

data.province.code=this.children[this.selectedIndex].value
data.province.value=this.children[this.selectedIndex].text

即此时数据应为是:

在数据存完之后我们就可以着手渲染我们的市级select标签了。

1,首先不管市级select中有没有option标签,我们先给它清除一遍(因为每个省份对应的市都不一样,如果不清除则下面渲染的市级option列表中含有上一个省份的市级option列表

oCity.options.length=0

2,清除完成之后我们用省级行政代码(code)去获取对应的市级列表即可:

districts['省级行政代码'] 等于对应市级列表

districts[data.province.code] // 获取用户选中的省份的市级列表

eg:

拿到该省份的对应市级列表之后,我们只需要向渲染省级列表一样渲染市级列表即可:

第三步,渲染区级列表

第三步同第二步基本完全一样,我们完全可以让它两共用一个函数:

在市级列表的onChange事件触发之后执行,

存储用户选中的市的code以及市名。

用获取到的市级code去换对应的区级列表即可(因为不存在数组对象嵌套,所以同省级code换市列表一样);

districts[data.province.code] // 获取用户选中的市级的区级列表

在渲染区级之前先清空一直区级select下的option标签列表

eg:

代码同上基本一样,除了需要注意此时我们的存值的对应是我们事先定义好的市级对应city而不是province即可。

当区级select标签onChange事件触发时

区级的 onChange 事件触发,此时我们已经不需要再给渲染新的 select 标签了(因为不是四级联动,其实都一样啦,大不了再复制一层呗)。所以我们只需要把用户选中的结果存放在我们事先定义好的 data 中的 area 区级对象即可。

这样,当用户选择完毕之后,我们就会得到一个很清晰的对象了。

至此基本完工。

完善

初步渲染完成时应该给它下级一个默认值,这样如果用户不选了不至于获取到的数据不完整:

1,渲染完省级列表时默认给它一个选中的市,并存值。

使用element.dispatchEvent().。实现onChange事件初始化触发

参考资料:https://www.jianshu.com/p/5f9027722204

此时浏览器刚刷新数据为:

源码(不含省市区文件,省市区文件将开头):

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<style type="text/css">
			select {
				height: 30px;
				margin-right: 10px;
			}
		</style>
	</head>
	<body>
		<!-- 省级列表 -->
		<select id="province"></select>
		<!-- 市级列表 -->
		<select id="city"></select>
		<!-- 区级列表 -->
		<select id="area"></select>
		
		<script type="module">
			// 引入省市区文件
			import districts from './js/districts.js'
			
			// 获取省市区selectDOM节点
			let oProvince=document.getElementById('province')
			let oCity=document.getElementById('city')
			let oArea=document.getElementById('area')
			
			// 存储用户选中的值
			let data={
				province: {},
				city: {},
				area: {}
			}
			
			// 渲染省级select标签
			let provinceList=districts[100000] 
			for (let province in provinceList) {
				oProvince.options.add( new Option(provinceList[province], province) )
			}
			
			
			// 当用户选中某个省份时触发
			oProvince.addEventListener('change', function() {
				// 先清空之前的市级<select>标签下的option列表
				oCity.options.length=0
				// 保存省级数据
				data.province.code=this.children[this.selectedIndex].value
				data.province.value=this.children[this.selectedIndex].text
				// 渲染市级列表
				for(let city in districts[data.province.code]) {
					oCity.options.add( new Option(districts[data.province.code][city], city) )
				}
			}, false)
			
			
			// 当用户选中某个市时触发
			oCity.addEventListener('change', function() {
				oArea.options.length=0
				// 保存市级数据
				data.city.code=this.children[this.selectedIndex].value
				data.city.value=this.children[this.selectedIndex].text
				// 渲染区级列表
				for(let city in districts[data.city.code]) {
					oArea.options.add( new Option(districts[data.city.code][city], city) )
				}
			}, false)
			
			// 当用户选中每个区时触发
			oArea.onchange=function () {
				// 保存区级数据
				data.area.code=this.children[this.selectedIndex].value
				data.area.value=this.children[this.selectedIndex].text
			}
			
			/**
			 * 渲染完成初始化
			 * @params dom selectDOM 
			 */
			function initSelect (dom) {
				let createE=document.createEvent('HTMLEvents')
				createE.initEvent("change", true, true)
				dom.dispatchEvent(createE)
			} 
			initSelect(oProvince)
			initSelect(oCity)
			initSelect(oArea)
			console.log(data)
		</script>
	</body>
</html>

至此基本完成啦。

用javascript中变量定义省份及对应的城市,应用Select标签对象,实现二级级联的下拉菜单选中效果。也就是说,在省份下拉菜单中,选中一个省份时,在城市下拉菜单中出现对应城市选择内容,效果如下:

当选择广东为省份的时候,城市栏会自动识别广东省下的城市展示出来

当省份选择广东省份的时候,去点击城市的选择栏会出现广东对应的城市选择!

具体代码如下:

html:

javascript:

报志愿需关注的网站

● 阳光高考网:教育部官方发布网站,有强基计划,综合评价,高校专项等的简章报名或申请 各大学校的招生章程,专业设置,考研和就业信息等。可以查专业、查院校,还有各种志愿填报常见问题汇总等。

https://gaokao.chsi.com.cn/xxgk/

● 本省考试院官网 :本省的政策批次设置,填报时间,一分一段表,大学往年的投档分,招生计划征集志愿等。要常常登陆该网站,志愿填报也是在该网站进行。比如● 河北省教育考试院http://www.hebeea.edu.cn

● 目标高校的本科招生网:学校和专业的录取分数线,招生计划,院系设置,师资力量等

● 学位与研究生信息网:查询各大学的学科评估结果,哪些专业是好专业 http://www.cdgdc.edu.cn/xwyyjsjyxx/xkpgjg/


● 河北招生考试信息服务网http://www.hebeeb.com

● 中外合作办学监管信息平台

● 大学生必备网https://m.dxsbb.com/news/7454.html 各个省份高校查询

● 研招网:https://yz.chsi.com.cn/wap/

● 公众号:青塔 软科

● 国家高等教育智慧教育平台https://higher.smartedu.cn/subjects

● 报考军校要知道的三个权威信息来源:军校招生(公众号)、黄埔一号v军校(公众号)、中国军网(公众号)


● 志愿填报期间,每天0时—6时为系统维护时间,不能填报志愿。

● 填报志愿网站:https://gk.hebeea.edu.cn

● 高考网址导航http://www.gaokao789.com

● 填报志愿机构汇总 学业有方 https://mall.futuresquare.cn/home

● 考试成绩查询途径如下:

● 1.河北省教育考试院网站:http://www.hebeea.edu.cn

● 2.河北招生考试信息服务网:http://www.hebeeb.com