省市区三级联动插件:app-jquery-cityselect.js

(function ($)
{
    $.fn.cityselect = function (options)
    {
        var settings = $.extend ({}, options);
        
        this.empty ();
        
        var provinceId, provinceName, cityId, cityName;
        
        if (settings.loadDefault)
        {
            var defaultData = settings.loadDefault ();
            
            provinceId = defaultData.provinceId;
            provinceName = defaultData.provinceName;
            cityId = defaultData.cityId;
            cityName = defaultData.cityName;
        }
        
        var provinceInput = $ ('<select class="form-control" ></select>');
        var cityInput = $ ('<select class="citySel form-control" ></select>');
        
        this.addClass ("input-append");
        this.append (provinceInput);
        this.append (cityInput);
        
        if (settings.loadProvince)
        {
            
            var provinceList = settings.loadProvince ();
            $.each (provinceList, function (i, p)
            {
                if (i == 0)
                {
                    if (settings.areaInput)
                    {
                        settings.areaInput.val (p.id);
                    }
                    if (settings.onAreaIdChanged)
                    {
                        settings.onAreaIdChanged (p.id);
                    }
                    if (settings.onProvinceChanged)
                    {
                        settings.onProvinceChanged (p.id, p.name);
                    }
                }
                var node = $ ('<option value="{0}">{1}</option>'.format (p.id, p.name));
                if (provinceId && p.id == provinceId)
                {
                    node.attr ("selected", "selected");
                    setProvinceInput (p.id);
                }
                provinceInput.append (node);
            });
        }
        else
        {
            throw "必须设置 loadProvince 回调函数";
        }
        
        provinceInput.on ("change", function (e, d)
        {
            var selected = $ (this).find ("option:selected");
            
            if (settings.areaInput)
            {
                settings.areaInput.val (selected.val ());
            }
            if (settings.onAreaIdChanged)
            {
                settings.onAreaIdChanged (selected.val ());
            }
            if (settings.onProvinceChanged)
            {
                settings.onProvinceChanged (selected.val (), selected.text ());
            }
            
            setProvinceInput (selected.val ());
        });
        
        function setProvinceInput (provinceId)
        {
            if (settings.loadCity)
            {
                
                var cityList = settings.loadCity (provinceId);
                
                cityInput.empty ();
                $.each (cityList, function (i, p)
                {
                    if (i == 0)
                    {
                        if (settings.areaInput)
                        {
                            settings.areaInput.val (p.id);
                        }
                        if (settings.onAreaIdChanged)
                        {
                            settings.onAreaIdChanged (p.id);
                        }
                        if (settings.onCityChanged)
                        {
                            settings.onCityChanged (p.id, p.name);
                        }
                    }
                    var node = $ ('<option value="{0}">{1}</option>'.format (p.id, p.name));
                    if (cityId && p.id == cityId)
                    {
                        node.attr ("selected", "selected");
                    }
                    cityInput.append (node);
                    
                });
                
            }
            else
            {
                throw "必须设置 loadCity 回调函数";
            }
            
        }
        
        cityInput.on ("change", function (e, d)
        {
            var selected = $ (this).find ("option:selected");
            
            if (settings.areaInput)
            {
                settings.areaInput.val (selected.val ());
            }
            if (settings.onAreaIdChanged)
            {
                settings.onAreaIdChanged (selected.val ());
            }
            if (settings.onCityChanged)
            {
                settings.onCityChanged (selected.val (), selected.text ());
            }
        });
        
        return this;
        
    };
    
}) (jQuery);