JS省市街地連動

39558 ワード

JS省市街地使用文書
一:サーバーはJSONフォーマットを返して以下のURLの中でdataのフォーマットを要求します:(KISSYコンポーネントdataフォーマットを持ってきました)
         http://gallery.kissyui.com/cityselector/doc/linkage-data.js  
二:使用する場合、ページhead部分はjqueryと省市区JSを導入する必要があり、HTML構造に依存するのは以下の通りである.
       
       
       
属性の説明:
id:ドロップダウンボックスdomノード(ページ上では一意)、js初期化用のフック.
Data-code:ページを初期化する際に、省市街地のコードに基づいてその省、市、区を指定して表示することができます.例えば、「吉林省長春市朝陽区」ページのデフォルト表示を指定したい場合は、HTML構造に対応するdata-code符号化を加えて指定できます.例えば、以下のようにします.
                                   
ページが開くと次のように表示されます.
         
三:省市区JSの初期化方法は以下の通りである.
               var selectVal = new CitySelect({
                         data   : data,
                         provId : "#prov4",
                         cityId : '#city4',
                         areaId : '#area4'
                  });
プロパティの説明は次のとおりです.
data:data構成項目とは、バックグラウンドで返されるjsonデータの保存されたグローバル変数を指す.
provIdとは、省ドロップダウンボックスselectのidを指す.
cityIdとは、都市ドロップダウンボックスselectのidを指す.
areaIdは、ドロップダウンボックスselectのidを指します.
省市区id伝参方式:いずれもXXXである.
省市区の基本的な配置項目は以下の通りである.
data:バックグラウンドから返されるJSONデータのこと.
provId:省ドロップダウンselectのid.
cityId:都市ドロップダウンボックスselectのidを指します.
areaId:ドロップダウンボックスselectのidを指します.
isSelect:デフォルトではtrueで1番目の項目を選択します.ページに省・市街地の項目が指定されている場合、指定された項目が表示されます.falseの場合は、「選択してください」を選択します.
ProvCallBack:省ドロップダウンボックスのレンダリングが完了したコールバック関数.
cityCallBack:市ドロップダウンボックスのレンダリングが完了したコールバック関数.
areaCallBack:領域ドロップダウンボックスのレンダリングが完了したコールバック関数.
デモ:
一:デフォルトのHTML構造は以下の通りです.
                            
JSコードの初期化方法は以下の通りである.
      var selectVal = new CitySelect({           data : data,           provId : "#prov4",           cityId : '#city4',           areaId : '#area4'      });
ページを開くと、次のように表示されます.
     
     1. ページが開くとデフォルトで最初の北京が表示され、省市街地によって他の省を切り替えることもできます.上のgif図が見えると、下のselectの属性data-codeも変化します.省がドロップダウンボックスを選択してくださいと切り替えると、省市街地のdata-codeは-1になり、市、区は選択できません.ドロップダウン・ボックスのみを選択してください.
     2. 省がある場合、市を「選択してください」に切り替えると、区も対応する市と区selectのdata-code値を-1に変更します.ここでdata-codeはformフォームのコミットに必要です.つまり、○○省の下のすべての市とすべての区です.
     3. 同時に省、市がある場合、私の区もchangeすることができて、それでは他の区を選ぶ時data-codeも同時に変化して、選択してくださいに切り替える時valueは-1で、つまりある省の○○市の下のすべての区です. 
2つ目は、ページが初期化されると、ある省の○○市の○○区を指定したいときに、次の図のようにHTML構造をどのように書くかということです.
           JS省市区联动_第1张图片
selectボックスにdata-codeプロパティを追加して、次のように指定できます.
         
注意:もし私が省を指定したら:浙江省、市:浙江省の中の市ではありません.では、選ばれた市は浙江省のデフォルトの最初の市で、同理区も同じです.
三:第三の初期化は、コンフィギュレーション項目isSelectによってコンフィギュレーションされ、デフォルトではこのコンフィギュレーション項目がtrueであり、省市街地が指定されていない場合はデフォルトで第一項を選択し、指定された省市街地があれば、指定された省市街地を表示する.isSelectプロファイルがfalseの場合、デフォルトではドロップダウン・ボックスを選択します.コードを見て次のように判断できます!
         JS省市区联动_第2张图片
gif図に表示されているものも見ることができます.
         
上記gif図に示すように、デフォルトでは「選択してください」ドロップダウンボックス、data-codeはすべて-1であり、ある省を選択するとdata-code値が変化しますが、対応する「市」と「区」はドロップダウンボックスを選択し、同じ市を選択するとselectの属性data-codeも変化しますが、区ドロップダウンボックスは「選択してください」ドロップダウンボックスです.選択領域のいずれかを選択するとdata-codeも相応に変化する.
JS初期化方式は以下の通りで、1つの構成項目isSelect:falseを追加するだけでよい.
       var selectVa2 = new CitySelect({             data : data,             provId : "#prov5",             cityId : '#city5',             areaId : '#area5',             isSelect: false       });
以下にすべてのHTMLコードを示します.

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <script type="text/javascript" src="js/jquery-1.4.4.min.js"></script>
  <script src="js/city2.js"></script>
  <script type="text/javascript" src="js/citySelect2.js"></script>
  <title>Document</title>
 </head>
 <body>

    <div id="city_4">
          <select class="prov" id="prov4" data-code ="220000"></select> 
        <select class="city" id="city4" data-code ="220100"></select>
        <select class="dist" id="area4" data-code ="220104"></select>
    </div>

    <div id="city_5">
          <select class="prov" id="prov5">
            
        </select> 
        <select class="city" id="city5"></select>
        <select class="dist" id="area5"></select>
    </div>
    <script>
            
            var selectVal = new CitySelect({
                data   : data,
                provId : "#prov4",
                cityId : '#city4',
                areaId : '#area4'
            });
            
                
            var selectVa2 = new CitySelect({
                data   : data,
                provId : "#prov5",
                cityId : '#city5',
                areaId : '#area5',
                isSelect: false
            });
            
    </script>
 </body>
</html>

View Code
JAvascriptコードは次のとおりです.

/**
 * Jquery         
 * @version 0.0.2
 */

 function CitySelect(options) {
    this.config = {
         data             :      '',             //   
         provId           :      '',             //     id       #XXX
         cityId           :      '',             //     id       #XXX
         areaId           :      '',             //     id       #XXX
         isSelect         :      true,           //    true                   ,      。
                                                 //   false,    "   "
         provCallBack     :      null,           //          
         cityCallBack     :      null,           //          
         areaCallBack     :      null            //          
    };
    this.config = $.extend(this.config, options || {});
    this.init();
 }

 CitySelect.prototype = {

    constructor: CitySelect,
    
    /*
     *      init
     */
    init: function() {
        var self = this,
            _config = self.config;

        if(!/^#/.test(_config.provId)) {
            alert("  ID     ,    #XXX");
            return;
        }
        if(!/^#/.test(_config.cityId)) {
            alert("  ID     ,    #XXX");
            return;
        }
        if(!/^#/.test(_config.cityId)) {
            alert(" ID     ,    #XXX");
            return;
        }
        this.provCode = $(_config.provId).attr("data-code");
        this.cityCode = $(_config.cityId).attr("data-code");
        this.areaCode = $(_config.areaId).attr("data-code");
        
        //     id (#XX --> XX)
        this.provid =  _config.provId.replace(/^#/g,'');
        this.cityid = _config.cityId.replace(/^#/g,'');
        this.areaid = _config.areaId.replace(/^#/g,'');

        //     
        self._provFunc();

        //       
        self._cityFunc();
        
        //          
        self._areaFunc();
        
        //        -1          select  -1
        var provFirstOpt = $(_config.provId).val();
        if(provFirstOpt == -1) {
            $(_config.provId).attr("data-code","-1");
            $(_config.cityId).attr("data-code","-1");
            $(_config.areaId).attr("data-code","-1");
        }
        // change             and   
        $(_config.provId).change(function(e){
            self._cityFunc();
            self._areaFunc();
        });

        //   change        
        $(_config.cityId).change(function(e){
            self._areaFunc();
        });
        //  change   
        $(_config.areaId).change(function(){
            $(_config.areaId).attr("data-code",$(this).val());
        });
    },
    /*
     *      
     * @method _provFunc {private}
     */
    _provFunc: function(){
        var self = this,
            _config = self.config;

        var elemHtml = '';
        elemHtml+= '<option value="-1" data-name="   " selected>   </option>';

        $(_config.data).each(function(i,curItem){
            elemHtml += "<option data-name='"+curItem[1]+"' value='"+curItem[0]+"'>"+curItem[1]+"</option>";
        });
        $(_config.provId).html(elemHtml);
        
        if(_config.isSelect) {
            $($(_config.provId + " option")[1]).attr("selected",'true');
            if(this.provCode) {
                self._setSelectCode(_config.provId,this.provCode);
            }
        }
        
        _config.provCallBack && $.isFunction(_config.provCallBack) && _config.provCallBack();
    },
    /*
     *          
     * @method _cityFunc {private}
     */
    _cityFunc: function(){
        var self = this,
            _config = self.config;

        var provIndex = $(_config.provId).get(0).selectedIndex,   //        index
            elemHtml = '',
            prov,
            citys,
            provOpt;
        
        provOpt = $($(_config.provId + ' option')[0]).attr("value");
        var opthtml = '<option value="-1" data-name="   " selected>   </option>';

        //                    
        if(provOpt == -1) {
            provIndex--;
        }
        $(_config.cityId).empty();
        $(_config.areaId).empty();
        /*
         *            "   "          value  -1
         *                  option
         */
        if(provIndex < 0){
            $(_config.provId).attr("data-code",'-1');
            $(_config.cityId).attr("data-code",'-1');
            $(_config.areaId).attr("data-code",'-1');

            $(_config.cityId).html(opthtml);
            $(_config.areaId).html(opthtml);
            return;
        }
        prov = _config.data[provIndex];
        citys = prov[2];
        elemHtml += '<option value="-1" data-name="   ">   </option>';
        for(var m = 0; m < citys.length; m++) {
            var oneCity = citys[m];
            elemHtml += "<option value='"+oneCity[0]+"' data-name='"+oneCity[1]+"'>"+oneCity[1]+"</option>";
        }
        $(_config.cityId).html(elemHtml);

        if(_config.isSelect) {
            $($(_config.cityId + " option")[1]).attr("selected",'true');
            if(this.cityCode) {
                self._setSelectCode(_config.cityId,this.cityCode);
            }
        }
        self._selectChangeCode();

        _config.cityCallBack && $.isFunction(_config.cityCallBack) && _config.cityCallBack();
    },
    /*
     *          
     * @method _areaFunc {private}
     */
    _areaFunc: function(){
        var self = this,
            _config = self.config;

        var    provOpt = $($(_config.provId + ' option')[0]).attr("value"),
            cityOpt = $($(_config.cityId + ' option')[0]).attr("value");

        var provIndex = $(_config.provId).get(0).selectedIndex,
            cityIndex = $(_config.cityId).get(0).selectedIndex,
            elemHtml = "",
            prov,
            citys,
            areas,
            oneCity;
        var opthtml = '<option value="-1" data-name="   " selected>   </option>';
        
        /*
         *        "    "                      index-1
         *         "   ",     "   "       index - 1
         */
        if(provOpt == -1) {
            provIndex--;
            cityIndex--;

        }else if(provOpt != -1 && cityOpt == -1) {
            cityIndex--;
        }
        
        if(provIndex < 0 || cityIndex < 0){
            $(_config.cityId).attr("data-code",'-1');
            $(_config.areaId).attr("data-code",'-1');
            $(_config.areaId).html(opthtml);
            return;
        };
        prov = _config.data[provIndex];
        citys = prov[2];
        oneCity = citys[cityIndex];
        areas = oneCity[2];

        elemHtml += '<option value="-1" data-name="   ">   </option>';
        if(areas != null) {
            for(var n = 0; n < areas.length; n++) {
                var oneArea = areas[n];
                elemHtml += "<option value='"+oneArea[0]+"' data-name='"+oneArea[1]+"'>"+oneArea[1]+"</option>";
            }
            
        }
        $(_config.areaId).html(elemHtml);
        
        if(_config.isSelect) {
            $($(_config.areaId + " option")[1]).attr("selected",'true');
            if(this.areaCode) {
                self._setSelectCode(_config.areaId,this.areaCode);
            }
        }
        self._selectChangeCode();

        _config.areaCallBack && $.isFunction(_config.areaCallBack) && _config.areaCallBack();
    },
     /*
     *   change        select    data-code   
     * @method _changeSetCode private
     * @param selectId    select dom  
     */
    _changeSetCode: function(selectId){
        var self = this,
            _config = self.config;
        var idx = selectId.selectedIndex, //     option   
            option,
            value,
            dataValue = $(_config.provId).val();
        var html = "<option data-name='   ' value='-1' selected>   </option>",
            provOpt = $($(_config.provId + ' option')[0]).attr("value");

        if(idx > -1) {
            if(dataValue == -1) {
                if(provOpt != "-1") {
                    $(_config.provId).prepend(html);
                    $(_config.cityId).prepend(html);
                    $(_config.areaId).prepend(html);
                }
                $(_config.provId).attr("data-code",'');
                $(_config.cityId).attr("data-code",'');
                $(_config.areaId).attr("data-code",'');
            }else {
                option = selectId.options[idx];  //     option  
                value = $(option).val();
                $(selectId).attr("data-code",value);
            }
        }
    },
    _selectChangeCode: function(){
        var self = this,
            _config = self.config;

        //  change      select   data-code    
        var provId = document.getElementById(this.provid);
        self._changeSetCode(provId);

        //  change      select   data-code    
        var cityId = document.getElementById(this.cityid);
        self._changeSetCode(cityId);
        
        //  change      select   data-code    
        var areaId = document.getElementById(this.areaid);
        self._changeSetCode(areaId);
    },
     /*
     *      select  data-code            
     * @method _setSelectCode {private}
     * @param selectId     Id
     */
    _setSelectCode: function(selectId,code){
        var self = this,
            _config = self.config;
            
        var optionElems = $(selectId + " option");
        
        $(optionElems).each(function(index,item){
            var curCode = $(item).val();
            if(curCode == code) {
                $(item).attr("selected",'true');
                $(selectId).attr("data-code",curCode);
                return;
            }
        });
    }
 };

View Code
JS省市区demoダウンロード