js基礎學習之兩級聯動
本來最近在學習ajax,學著學著學到html——js——ajax,踏踏實實學習真好,佈置於在做專案的時候,看不懂這個,看不懂那個,今天就跟大家談談這個小demo,兩級聯動,其實三級聯動也好做,有空再做吧,自己以後要是用到了,也能看看。當然現在有好多的人或者公司已經這個玩意,寫了一遍有一遍,完善了一遍又一遍,學習或者以後工作,總不能拿別人的就用,處理問題,也搞不定那個最煩人,還是自己瞭解一點好。
- 效果圖
首先這個做的比較簡陋,我只是想表達關於這個二級聯動的實現方法,對於入門級的人也挺好
二、實現原始碼
//頁面程式碼 <body> < <table> <tr> <td>所在省份</td> <td><select id="province" name="province"> <option value="">請選擇省....</option> </ </td> <td>所在市區</td> <td><select id="city" name="city"> <option value="">請選擇市.....</option> </select> </ </tr> </table> </div> </body> |
<script language="JavaScript"> window.onload = function() { //頁面載入的時候開始讀取xml檔案 var xmlDoc = getxmlDoc("Provinces.xml"); var provinceXmlElements = xmlDoc.getElementsByTagName("Province"); var provinceElement = document.getElementById("province"); for (var i = 0; i < provinceXmlElements.length; i++) { var provinceXmlElement = provinceXmlElements[i]; var nameAttr = provinceXmlElement.getAttribute("ProvinceName"); var provinceOptions = document.createElement("option"); var optionsText = document.createTextNode(nameAttr); provinceOptions.setAttribute("value", nameAttr); provinceOptions.appendChild(optionsText); provinceElement.appendChild(provinceOptions); } //當下拉框中值改變時 document.getElementById("province").onchange = function() { //當下拉列表改變時,獲取選中的值 var htmlValue = this.value; var cityElement = document.getElementById("city"); var oldOptionElements = cityElement.getElementsByTagName("option"); for (var i = oldOptionElements.length - 1; i > 0; i--) { cityElement.removeChild(oldOptionElements[i]); } //讀取配置檔案 var xmlDoc = getxmlDoc("Provinces.xml"); //獲取所有的省標籤 var provinceXmlElements = xmlDoc.getElementsByTagName("Province"); var provinceElement = null; // alert(provinceXmlElements.length); for (var i = 0; i < provinceXmlElements.length; i++) { var provinceXmlElement = provinceXmlElements[i]; var nameAttr = provinceXmlElement.getAttribute("ProvinceName"); if (nameAttr == htmlValue) { provinceElement = provinceXmlElement; } } if (provinceElement != null) { var cityXmlElements = provinceElement .getElementsByTagName("city"); for (var i = 0; i < cityXmlElements.length; i++) { var cityValue = cityXmlElements[i].firstChild.nodeValue; var optionElement = document.createElement("option"); optionElement.setAttribute("cityValue", cityValue); var optionTextElement = document.createTextNode(cityValue); optionElement.appendChild(optionTextElement); cityElement.appendChild(optionElement); } } } /** * 跨瀏覽器的解析xml檔案的函式 * @param {Object} fileXmlName */ function getxmlDoc(xmlFile) { var xmlDoc; if (window.ActiveXObject) { xmlDoc = new ActiveXObject('Microsoft.XMLDOM');//IE xmlDoc.async = false; xmlDoc.load(xmlFile); } else if (isFirefox=navigator.userAgent.indexOf("Firefox")>0) { //火狐 xmlDoc = document.implementation.createDocument('', '', null); xmlDoc.load(xmlFile); } else{ //谷歌 var xmlhttp = new window.XMLHttpRequest(); xmlhttp.open("GET",xmlFile,false); xmlhttp.send(null); if(xmlhttp.readyState == 4){ xmlDoc = xmlhttp.responseXML.documentElement; } } return xmlDoc; } } </script> |
- 實現原理
(1)首先準備好xml檔案,省市縣,固定的省對應固定的市,固定的市對應固定的縣。
(2)開始解析你準備好的xml檔案(其實這裡你如果將基礎學的比較紮實,其實讀取xml檔案就是讀取它對應的節點、對應的文字屬性、文字內容,其實xml最初就是想取代html,無奈html越來越火,無法取代,所以xml就開啟了它無盡的配置之路)
指定程式碼:解析xml檔案,在此之前我寫的不支援谷歌和火狐,所以我就上網去找到了相容的xml解析方法(一下就是,可以直接用)
/** * 跨瀏覽器的解析xml檔案的函式 * @param {Object} fileXmlName */ function getxmlDoc(xmlFile) { var xmlDoc; if (window.ActiveXObject) { xmlDoc = new ActiveXObject('Microsoft.XMLDOM');//IE xmlDoc.async = false; xmlDoc.load(xmlFile); } else if (isFirefox=navigator.userAgent.indexOf("Firefox")>0) { //火狐 xmlDoc = document.implementation.createDocument('', '', null); xmlDoc.load(xmlFile); } else{ //谷歌 var xmlhttp = new window.XMLHttpRequest(); xmlhttp.open("GET",xmlFile,false); xmlhttp.send(null); if(xmlhttp.readyState == 4){ xmlDoc = xmlhttp.responseXML.documentElement; } } return xmlDoc; } } |
(2)在頁面載入之前讀取一次xml載入所有的省份,並把所有的省份通過dom技術附加在selected(技術如下:如有疑問請聯絡我),在此處解釋一下關於window.onload = function(){},只有當頁面中所有資源載入完畢之後,才執行大括號裡面的程式碼
//頁面載入的時候開始讀取xml檔案 var xmlDoc = getxmlDoc("Provinces.xml"); var provinceXmlElements = xmlDoc.getElementsByTagName("Province"); var provinceElement = document.getElementById("province"); for (var i = 0; i < provinceXmlElements.length; i++) { var provinceXmlElement = provinceXmlElements[i]; var nameAttr = provinceXmlElement.getAttribute("ProvinceName"); var provinceOptions = document.createElement("option"); var optionsText = document.createTextNode(nameAttr); provinceOptions.setAttribute("value", nameAttr); provinceOptions.appendChild(optionsText); provinceElement.appendChild(provinceOptions); } |
以上解決所有省份加入下拉列表
當我們點選不同省份,城市下拉列表顯示該省所屬的城市
解析方法:
(1)新增監聽事件,獲取省份改變的值;
document.getElementById("province").onchange= function() { var htmlValue = this.value; } |
(2)同樣通過xml解析出所有省份,改變的值與解析出的某一省份相同,將該省份設定成全域性變數,然後通過該省的名稱獲取其孩子節點(即城市節點)
//讀取配置檔案 var xmlDoc = getxmlDoc("Provinces.xml"); //獲取所有的省標籤 var provinceXmlElements = xmlDoc.getElementsByTagName("Province"); //設定全域性變數 var provinceElement = null; //alert(provinceXmlElements.length); //遍歷每一個省份 for (var i = 0; i < provinceXmlElements.length; i++) { var provinceXmlElement = provinceXmlElements[i]; var nameAttr = provinceXmlElement.getAttribute("ProvinceName"); //比對改變值與解析出相同的省份 if (nameAttr == htmlValue) { provinceElement = provinceXmlElement; } } |
(3)遍歷屬於該省份所有城市節點,並經該節點陣列一個一個新增在城市下拉列表中
if (provinceElement != null) { var cityXmlElements = provinceElement .getElementsByTagName("city"); for (var i = 0; i < cityXmlElements.length; i++) { var cityValue = cityXmlElements[i].firstChild.nodeValue; var optionElement = document.createElement("option"); optionElement.setAttribute("cityValue", cityValue); var optionTextElement = document.createTextNode(cityValue); optionElement.appendChild(optionTextElement); cityElement.appendChild(optionElement); } } |
當然目前我還未整理縣和區,所以只做了兩級聯動,其實根本方法與此相同,不過大神們做的更牛逼的聯動,也是我追求的夢想與方向,歡迎批評指點!!!
(4)當然在每次載入城市之後換其他省份時,我們需要將之前的省份所屬城市刪除
var cityElement = document.getElementById("city"); var oldOptionElements = cityElement.getElementsByTagName("option"); for (var i = oldOptionElements.length - 1; i > 0; i--) { cityElement.removeChild(oldOptionElements[i]); } |
如果有需要省市文件xml的,請下方留言,完全免費!!!