原生javascript製作省市區三級聯動詳細教程

蔣偉平發表於2021-01-17

多級聯動下拉選單是前端常見的效果,省市區三級聯動又屬於其中最典型的案例。多級聯動一般都是與資料相關聯的,根據資料來生成和修改聯動的下拉選單。完成一個多級聯動效果,有助於增強對資料處理的能力。

本例項以省市區三級聯動為例,來說明具體是如何使用javascript來關聯資料,實現聯動下拉選單。學習本教程之前,讀者需要具備html和css技能,同時需要有簡單的javascript基礎。

這裡先準備三個select元素,如下所示:

<div class="select_wrap">
  <span>省:</span>
  <select id="province">
    <option value="">請選擇</option>
  </select>
  <span>市:</span>
  <select id="city">
    <option value="">請選擇</option>
  </select>
  <span>區/縣:</span>
  <select id="county">
    <option value="">請選擇</option>
  </select>
</div>

 

再準備一些城市相關資料,本例項只列舉了少量數量。如下所示:

var data = {
  "北京市": {
    "市轄區": ["東城區", "西城區", "朝陽區", "豐臺區", "石景山區", "海淀區", "門頭溝區", "房山區", "通州區", "順義區", "昌平區", "大興區", "懷柔區", "平谷區", "密雲區", "延慶區"]
  },
  "河北省": {
    "石家莊市": ["長安區", "橋西區", "新華區", "井陘礦區", "裕華區", "藁城區", "鹿泉區", "欒城區", "井陘縣", "正定縣", "行唐縣", "靈壽縣", "高邑縣", "深澤縣", "贊皇縣", "無極縣", "平山縣", "元氏縣", "趙縣", "石家莊高新技術產業開發區", "石家莊迴圈化工園區", "辛集市", "晉州市", "新樂市"],
    "唐山市": ["路南區", "路北區", "古冶區", "開平區", "豐南區", "豐潤區", "曹妃甸區", "灤縣", "灤南縣", "樂亭縣", "遷西縣", "玉田縣", "唐山市蘆臺經濟技術開發區", "唐山市漢沽管理區", "唐山高新技術產業開發區", "河北唐山海港經濟開發區", "遵化市", "遷安市"],
    "秦皇島市": ["海港區", "山海關區", "北戴河區", "撫寧區", "青龍滿族自治縣", "昌黎縣", "盧龍縣", "秦皇島市經濟技術開發區", "北戴河新區"],
    "邯鄲市": ["邯山區", "叢臺區", "復興區", "峰峰礦區", "肥鄉區", "永年區", "臨漳縣", "成安縣", "大名縣", "涉縣", "磁縣", "邱縣", "雞澤縣", "廣平縣", "館陶縣", "魏縣", "曲周縣", "邯鄲經濟技術開發區", "邯鄲冀南新區", "武安市"],
    "衡水市": ["桃城區", "冀州區", "棗強縣", "武邑縣", "武強縣", "饒陽縣", "安平縣", "故城縣", "景縣", "阜城縣", "河北衡水經濟開發區", "衡水濱湖新區", "深州市"]
  },
  "湖南省": {
    "長沙市": ["芙蓉區", "天心區", "嶽麓區", "開福區", "雨花區", "望城區", "長沙縣", "瀏陽市", "寧鄉市"],
    "株洲市": ["荷塘區", "蘆淞區", "石峰區", "天元區", "株洲縣", "攸縣", "茶陵縣", "炎陵縣", "雲龍示範區", "醴陵市"],
    "湘潭市": ["雨湖區", "嶽塘區", "湘潭縣", "湖南湘潭高新技術產業園區", "湘潭昭山示範區", "湘潭九華示範區", "湘鄉市", "韶山市"],
    "衡陽市": ["珠暉區", "雁峰區", "石鼓區", "蒸湘區", "南嶽區", "衡陽縣", "衡南縣", "衡山縣", "衡東縣", "祁東縣", "衡陽綜合保稅區", "湖南衡陽高新技術產業園區", "湖南衡陽松木經濟開發區", "耒陽市", "常寧市"],
  },
  "廣東省": {
    "廣州市": ["荔灣區", "越秀區", "海珠區", "天河區", "白雲區", "黃埔區", "番禺區", "花都區", "南沙區", "從化區", "增城區"],
    "韶關市": ["武江區", "湞江區", "曲江區", "始興縣", "仁化縣", "翁源縣", "乳源瑤族自治縣", "新豐縣", "樂昌市", "南雄市"],
    "深圳市": ["羅湖區", "福田區", "南山區", "寶安區", "龍崗區", "鹽田區", "龍華區", "坪山區"],
    "珠海市": ["香洲區", "斗門區", "金灣區"],
  }
};  

PS:實際工作的資料一般由資料庫提供。如有需要也可以到網上搜尋,很多大神都蒐集有完整的城市資料。

準備好這些,我們按照慣例來分析功能,再一步一步完成。

1 分別獲取省市縣三個下拉框,如下所示:

var eProvince = document.getElementById('province');
var eCity = document.getElementById('city');
var eCounty = document.getElementById('county');

獲取到這三個下拉框後,才可以通過運算元據來修改下拉框的選項。

 

2 遍歷資料;
頁面載入後,eProvince下拉框預設就應該是有資料的,所以需要遍歷資料,並取出其中的省份相關資料,生成option元素放到eProvince下拉框中,如下所示:

for(let k in data){
  //建立option元素
  let eOption = document.createElement('option');
  //設定option元素的值為資料中“省”的名稱
  eOption.value = k;
  eOption.innerHTML = k;
  //把option依次加入到eProvince下拉框中
  eProvince.appendChild(eOption);
}

這時候點選省份下拉框,就可以看到下拉資料,如圖所示:

 

 

3 省份下拉框繫結事件;
現在可以選擇省份了,在下拉框中選擇某個省,市下拉框就應該列出該省所包含的城市。所以需要給省份下拉框繫結一個change事件,如下所示:

 

eProvince.addEventListener('change',event=>{
  //獲取當前選擇的省份值
  let value = eProvince.value;
  //修改省份後,城市和區/縣下拉框中原有的值都會修改,直接通過修改eCity和eCounty元素innerHTML來初始化值
  eCity.innerHTML = eCounty.innerHTML = '<option value="">請選擇</option>';
  //判斷是否選擇了省份
  if(value!=''){
    //在資料中遍歷省份對應的城市
    for(let k in data[value]){
      //建立option元素
      let eOption = document.createElement('option');
      //設定option元素的值為資料中“城市”的名稱
      eOption.value = k;
      eOption.innerHTML = k;
      //把option依次加入到eCity下拉框中
      eCity.appendChild(eOption);
    }
  }
});

選擇省份之後,可以看到城市下拉框中也有了該省所包含的城市資料,如圖所示:

 

4 城市下拉框繫結事件;
現在可以選擇城市了,這時候選擇城市,區/縣下拉框就應該列出該市對應的區/縣資料,如下所示:

//城市改變時,把對應的資料放到區/縣下拉框中
eCity.addEventListener('change',event=>{
  //獲取已選擇的省份值
  let sProvince = eProvince.value;
  //獲取當前選擇的城市值
  let sCity = eCity.value;
  //找到對應城市資料
  let arr = data[sProvince][sCity];
  //初始化eCounty元素中原有的值
  eCounty.innerHTML = '<option value="">請選擇</option>';
  //判斷是否選擇的是城市名,而不是選擇“請選擇”
  if(sCity!=''){
    //遍歷城市中對應的區/縣資料
    for(let i=0;i<arr.length;i++){
      //建立option元素
      let eOption = document.createElement('option');
      //設定option元素的值為資料中“區/縣”的名稱
      eOption.value = arr[i];
      eOption.innerHTML = arr[i];
      //把option依次加入到eCounty下拉框中
      eCounty.appendChild(eOption);
    }
  }
});

好了,到這裡就完成了一個簡單的省市區三級聯動。選擇城市後,區/縣下也有對應的下拉資料,如圖所示:

 

 

 

相關文章