前段時間寫一個關於天氣的東西,裏面的省市區(縣)城市選擇讓我很頭疼,在網上搜索出來大都是藉助插件或者第三方庫,感受這樣作代碼會很重,因此索性就把幾種城市選擇的方式實現一遍,以備往後的不時之需。這三種方法都是針對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