前段时间写一个关于天气的东西,里面的省市区(县)城市选择让我很头疼,在网上搜索出来大都是借助插件或者第三方库,感受这样作代码会很重,因此索性就把几种城市选择的方式实现一遍,以备往后的不时之需。这三种方法都是针对pc端的,而且都是使用原生js实现的,连jq都没使用,因而代码有点繁琐额(尴尬)。。。。不过仍是让我把原理讲完吧。html
源代码地址→传送门node
预览地址→传送门git
/*自动加载省份列表*/ (function showProv() { btn.disabled = true; var len = provice.length; for (var i = 0; i < len; i++) { var provOpt = document.createElement('option'); provOpt.innerText = provice[i]['name']; provOpt.value = i; prov.appendChild(provOpt); } })();
onchange事件
,在onchange事件中根据前面所选的省份来显示对应城市。这里用到一个select的selectedIndex属性,从而获取刚刚点击的是哪一个省份(生成省份列表时添加了value属性值):var val = obj.options[obj.selectedIndex].value; //这里获得的是所选择省份在全部下拉项中为第几项
<!--方法是判断县区的length是否为0--> var countryLen = provice[current.prov]["city"][val].districtAndCounty.length; if(countryLen == 0){ addrShow.value = provice[current.prov].name + '-' + provice[current.prov]["city"][current.city].name; return; }
var provice = [ { name: "北京市", city: [ { name: "北京市", districtAndCounty: ["东城区", "西城区", "崇文区", "宣武区", "朝阳区", "丰台区", "石景山区", "海淀区", "门头沟区", "房山区", "通州区", "顺义区", "昌平区", "大兴区", "怀柔区", "平谷区", "密云县", "延庆县", "延庆镇"] } ] }, ...... { name: "河北省", city: [ { name: "石家庄市", districtAndCounty: ["长安区", "桥东区", "桥西区", "新华区", "裕华区", "井陉矿区", "辛集市", "藁城市", "晋州市", "新乐市", "鹿泉市", "井陉县", "微水镇", "正定县", "正定镇", "栾城县", "栾城镇", "行唐县", "龙州镇", "灵寿县", "灵寿镇", "高邑县", "高邑镇", "深泽县", "深泽镇", "赞皇县", "赞皇镇", "无极县", "无极镇", "平山县", "平山镇", "元氏县", "槐阳镇", "赵县", "赵州镇"] }, ....... { name: "邯郸市", districtAndCounty: ["丛台区", "邯山区", "复兴区", "峰峰矿区", "武安市", "邯郸县",.....,"曲周县", "曲周镇"] } ] } ]
addrWrap.onclick = function (e) { //将点击事件委托给列表的父元素 var n; var e = e || window.event; var target = e.target || e.srcElement; if (target && target.nodeName == 'LI') { /*先判断当前显示区域显示的是省市区的那部分*/ for (var z = 0; z < 3; z++) { if (titleWrap[z].className == 'titleSel') n = z; } /*显示的处理函数*/ switch (n) { case 0: showCity2(target.index); //点击的是省份中列表的某一项,接下来则显示城市列表 break; case 1: showCountry2(target.index); //点击的是城市列表中的某一项,接下来则显示县区列表 break; case 2: selectCountry(target.index); //点击具体的某个县区,则将该县区选择 break; default: showProv2(); } } };
//将事件委托给父元素,根据点击的分类进行处理(html的设置好li的value值) if (target.value == '0') { showProv2(); } else if (target.value == '1') { showCity2(current2.prov); } else { showCountry2(current2.city); }
switch (index) { case 0: //0为热门项 showHotCity(); break; case 6: //6为最后一栏,字母集个数为2 showCitys(index, 2); break; default: //其他索引,字母集个数都为4 showCitys(index, 4); }
function showCitys(index, m) { //经过传入的参数截取城市数据的一部分为当前要显示的城市列表 var currentAll = cityAll.slice(4 * index - 3, 4 * index + m - 3); ..... //将动态生成的列表项放到显示区域 }
var cityAll = [ { name: "hot", citys: ["北京", "上海", "广州", "深圳", "杭州", "南京", "成都", "重庆", "武汉", "长沙", "昆明"] }, { name: "A", citys: ["阿坝", "阿拉善", "阿里", "安康", "安庆", "鞍山", "安顺", "安阳", "澳门"] }, ...... { name: "Z", citys: ["杂多县", "赞皇县", "枣强县", "枣阳市", "枣庄",.......,资阳"] }
7.完美~github