
思路整理
功能有两个:
1.tab栏切换:当点击某个li时,切换到对应内容中,li是选中状态(清除点击选项之前的所有状态
2.三级联动:首先插入初始的省份,城市,区域,页面初始时,默认显示的是第一个省份的第一个城市的第一个区域
注意:如果是直辖市,例如北京,没有市,都是区域,此时需要判定城市数组长度==1,城市内容以及tab栏全部隐藏
然后分别设置3个点击事件,当点击省份时,拿到索引,要写入新的城市数据,并且清空上一个,tab栏也要自动更换
点击事件中的tab栏切换和写入省,市,区数据最好能封装函数,代码少很多
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>*{margin: 0;padding: 0;}a{text-decoration: none;color: black;}ul{list-style: none;}.clearfix::before,.clearfix::after{content: "";display: table;}.clearfix::after{clear: both;}.clearfix{zoom: 1;}.wrap{width: 500px;height: 300px;padding: 15px;border: 1px solid #e0e0e0;margin: 100px auto;}.tab-nav{height: 30px;border-bottom: 1px solid #e0e0e0;}.tab-nav ul li{float: left;width: 70px;border: 1px solid #e0e0e0;border-bottom: none;line-height: 28px;text-align: center;font-size: 12px;position: relative;}.tab-nav ul li:nth-child(1),.tab-nav ul li:nth-child(2){border-right: none;}/* 选中时的样式 */.tab-nav ul li.active{font-weight: 700;background-color: #fff;}/*伪元素相当于行标签 */.tab-nav ul li.active::before{content: "";position: absolute;width: 72px;height: 0;top: -1px;left: -1px;border-top: 2px solid #f10180;}.tab-nav ul li.active::after{content: "";position: absolute;bottom: -3px;left: -1px;width: 70px;border-top: 2px solid #fff;}/* 选项卡对应内容、 */.tab-con{margin-top: 30px;}.tab-con-item{display: none;}.con-show{display: block;}.tab-con-item ul li{float: left;width: 68px;border-bottom: 2px;}.tab-con-item ul li a{display: inline-block;max-width: 46px;padding-right: 10px;padding-left: 10px;white-space: nowrap;text-overflow: ellipsis;overflow: hidden;line-height: 20px;border: 1px solid #fff;font-size: 12px;color: black;box-sizing: content-box;}/* 鼠标悬停 */.tab-con-item ul li a:hover{color: #f10180;border: 1px solid #f10180;}.tab-con-item ul li a.selected{background-color: #f10180;color: white;}</style></head><body><div class="wrap"><div class="tab-nav"><ul class="clearfix"><li class="active">省份</li><li>城市</li><li>区域</li></ul></div><div class="tab-con"><div class="tab-con-item prov con-show"><ul class="clearfix"></ul></div><div class="tab-con-item city"><ul class="clearfix"></ul></div><div class="tab-con-item area"><ul class="clearfix"></ul></div></div></div><script src="./js/city_code.js"></script><script>var tabNavs=document.querySelectorAll('.tab-nav ul li')var tabCons=document.querySelectorAll('.tab-con-item')var provUl=document.querySelector('.prov ul')var cityUl=document.querySelector('.city ul')var areaUl=document.querySelector('.area ul')//功能1:tab栏切换var currentIndex=0//一个记录上次索引的变量for(var i=0;i<tabNavs.length;i++){//给li添加属性tabNavs[i].index=i;//点击tab-nav 中的litabNavs[i].onclick=function(){changeTab(this.index)}}//tab栏切换功能function changeTab(index) {//恢复被选中之前li的样式tabNavs[currentIndex].classList.remove('active')//隐藏之前选中的con区域tabCons[currentIndex].classList.remove('con-show')//设置当前选中li的样式tabNavs[index].classList.add('active')//显示被选中的con区域tabCons[index].classList.add('con-show')//记录当前点击的li索引currentIndex=index}//功能2:三级联动// 插入省var selected_prov_index=0//记录被选中省份a的索引function bindProvData(data){for(var i=0;i<data.length;i++){if (i==0) {//默认选中省份// 点击A标签不跳转页面,执行JS代码,那么地址栏里写javascript:;就可以provUl.innerHTML+=`<li><a href="javascript:;" class="selected" data-index="${i}">${data[i].name}</a></li>`selected_prov_index=icontinue;}provUl.innerHTML+=`<li><a href="javascript:;" data-index="${i}">${data[i].name}</a></li>`}}bindProvData(data);//插入城市selected_city_index=0function bindCityData(provIndex) {var cityArr=data[provIndex].city;// 默认选中省 的 城市数组if (cityArr.length==1) {//隐藏城市tab-navtabNavs[1].style.display='none'}else{// 普通省份,显示城市tab-bavtabNavs[1].style.display='block'// 插入城市for(var i=0;i<cityArr.length;i++){if (i==0) {cityUl.innerHTML+=`<li><a href="javascript:;" class="selected" data-index="${i}">${cityArr[i].name}</a></li>`selected_city_index=i;continue;}cityUl.innerHTML+=`<li><a href="javascript:;" data-index="${i}">${cityArr[i].name}</a></li>`}}}bindCityData(selected_prov_index);// 插入区域liselected_area_index=0function bindAreaData(provIndex,cityIndex) {var areaArr=data[provIndex].city[cityIndex].area;for(var i=0;i<areaArr.length;i++){areaUl.innerHTML+=`<li><a href="javascript:;" data-index="${i}">${areaArr[i].name}</a></li>`}selected_area_index=0;}bindAreaData(selected_prov_index,selected_city_index);// 3个点击事件所作事情不一样,不要循环绑定//点击省份atabCons[0].onclick=function(e){if (e.target.nodeName=='A') {// console.log('*********');// 更新城市 区域// 找到省份索引var provInd=e.target.dataset.index;// 清空城市cityUl.innerHTML=''//插入新的城市数据bindCityData(provInd)//清空区域areaUl.innerHTML=''// 插入新的区域数据,默认为第一个城市的区域// 城市索引固定为0var cityInd=0;bindAreaData(provInd,cityInd)// 切换省份时,更换选中样式var prov_as=document.querySelectorAll('.prov a')prov_as[selected_prov_index].classList.remove('selected')e.target.classList.add('selected')// 更新省份索引selected_prov_index=e.target.dataset.index// 判断点击的是直辖市还是普通省份var cityArr=data[selected_prov_index].cityif (cityArr.length==1) {changeTab(2)}else{changeTab(1)}}}//点击城市atabCons[1].onclick=function(e){if (e.target.nodeName=='A') {// 更新区域//须知省份索引和城市索引var cityInd=e.target.dataset.index// 清空区域areaUl.innerHTML=''//更新区域bindAreaData(selected_prov_index,cityInd)//切换城市选中的样式var city_as=document.querySelectorAll('.city a')city_as[selected_city_index].classList.remove('selected')e.target.classList.add('selected')selected_city_index=e.target.dataset.indexchangeTab(2)}}//点击区域atabCons[2].onclick=function(e){if (e.target.nodeName=='A') {// 切换选项的样式var area_as=document.querySelectorAll('.area a')area_as[selected_area_index].classList.remove('selected')e.target.classList.add('selected')// 记录当前被选中的区域a的索引// 直辖市的区域(没有市,直接是区)// 普通省份的区域selected_area_index=e.target.dataset.index}}</script></body></html>
