1. 程式人生 > >js基礎學習之兩級聯動

js基礎學習之兩級聯動

    本來最近在學習ajax,學著學著學到html——js——ajax,踏踏實實學習真好,佈置於在做專案的時候,看不懂這個,看不懂那個,今天就跟大家談談這個小demo,兩級聯動,其實三級聯動也好做,有空再做吧,自己以後要是用到了,也能看看。當然現在有好多的人或者公司已經這個玩意,寫了一遍有一遍,完善了一遍又一遍,學習或者以後工作,總不能拿別人的就用,處理問題,也搞不定那個最煩人,還是自己瞭解一點好。

  • 效果圖

    首先這個做的比較簡陋,我只是想表達關於這個二級聯動的實現方法,對於入門級的人也挺好

二、實現原始碼

//頁面程式碼

<body>

     <

div>

           <table>

                <tr>

                     <td>所在省份</td>

                     <td><select id="province" name="province">

                                <option value="">請選擇省....</option>

                          </

select>

                     </td>

                     <td>所在市區</td>

                     <td><select id="city" name="city">

                                <option value="">請選擇市.....</option>

                          </select>

                     </

td>

                </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的,請下方留言,完全免費!!!