123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- /**
- * jquery.citys.js 1.0
- * http://jquerywidget.com
- */
- ;(function (factory) {
- if (typeof define === "function" && (define.amd || define.cmd) && !jQuery) {
- // AMD或CMD
- define([ "jquery" ], function(){
- factory(jQuery);
- });
- } else {
- // 全局模式
- factory(jQuery);
- }
- }(function ($) {
- $.support.cors = true;
- $.fn.citys = function(parameter,getApi) {
- if(typeof parameter == 'function'){ //重载
- getApi = parameter;
- parameter = {};
- }else{
- parameter = parameter || {};
- getApi = getApi||function(){};
- }
- var defaults = {
- dataUrl:'/Public/plugins/json/list.json', //数据库地址
- dataType:'json', //数据库类型:'json'或'jsonp'
- provinceField:'province', //省份字段名
- cityField:'city', //城市字段名
- areaField:'area', //地区字段名
- code:0, //地区编码
- province:0, //省份,可以为地区编码或者名称
- city:0, //城市,可以为地区编码或者名称
- area:0, //地区,可以为地区编码或者名称
- required: true, //是否必须选一个
- nodata: 'hidden', //当无数据时的表现形式:'hidden'隐藏,'disabled'禁用,为空不做任何处理
- onChange:function(){} //地区切换时触发,回调函数传入地区数据
- };
- var options = $.extend({}, defaults, parameter);
- return this.each(function() {
- //对象定义
- var _api = {};
- var $this = $(this);
- var $province = $this.find('select[name="'+options.provinceField+'"]'),
- $city = $this.find('select[name="'+options.cityField+'"]'),
- $area = $this.find('select[name="'+options.areaField+'"]');
- $.ajax({
- url:options.dataUrl,
- type:'GET',
- crossDomain: true,
- dataType:options.dataType,
- jsonpCallback:'jsonp_location',
- success:function(data){
- var province,city,area,hasCity;
- if(options.code){ //如果设置地区编码,则忽略单独设置的信息
- var c = options.code - options.code%1e4;
- if(data[c]){
- options.province = c;
- }
- c = options.code - (options.code%1e4 ? options.code%1e2 : options.code);
- if(data[c]){
- options.city = c;
- }
- c = options.code%1e2 ? options.code : 0;
- if(data[c]){
- options.area = c;
- }
- }
- var updateData = function(){
- province = {},city={},area={};
- hasCity = false; //判断是非有地级城市
- for(var code in data){
- if(!(code%1e4)){ //获取所有的省级行政单位
- province[code]=data[code];
- if(options.required&&!options.province){
- if(options.city&&!(options.city%1e4)){ //省未填,并判断为直辖市
- options.province = options.city;
- }else{
- options.province = code;
- }
- }else if(data[code].indexOf(options.province)>-1){
- options.province = isNaN(options.province)?code:options.province;
- }
- }else{
- var p = code-options.province;
- if(options.province&&p>0&&p<1e4){ //同省的城市或地区
- if(!(code%100)){
- hasCity = true;
- city[code]=data[code];
- if(options.required&&!options.city){
- options.city = code;
- }else if(data[code].indexOf(options.city)>-1){
- options.city = isNaN(options.city)?code:options.city;
- }
- }else if(p>9000){ //省直辖县级行政单位
- city[code]=data[code];
- }else if(hasCity){ //非直辖市
- var c = code-options.city;
- if(options.city&&c>0&&c<100){ //同个城市的地区
- area[code]=data[code];
- if(options.required&&!options.area){
- options.area = code;
- }else if(data[code].indexOf(options.area)>-1){
- options.area = isNaN(options.area)?code:options.area;
- }
- }
- }else{
- city[code]=data[code]; //直辖市
- if(options.area){
- options.city = options.area;
- options.area = '';
- }
- if(options.required&&!options.city){
- options.city = code;
- }else if(data[code].indexOf(options.city)>-1){
- options.city = isNaN(options.city)?code:options.city;
- }
- }
- }
- }
- }
- };
- var format = {
- province:function(){
- $province.empty();
- if(!options.required){
- $province.append('<option value=""> - 请选择 - </option>');
- }
- for(i in province){
- $province.append('<option value="'+i+'">'+province[i]+'</option>');
- }
- if(options.province){
- $province.val(options.province);
- }
- this.city();
- },
- city:function(){
- $city.empty();
- if(!options.required){
- $city.append('<option value=""> - 请选择 - </option>');
- }
- if(options.nodata=='disabled'){
- $city.prop('disabled',$.isEmptyObject(city));
- }else if(options.nodata=='hidden'){
- $city.css('display',$.isEmptyObject(city)?'none':'');
- }
- for(i in city){
- $city.append('<option value="'+i+'">'+city[i]+'</option>');
- }
- if(options.city){
- $city.val(options.city);
- }
- this.area();
- },
- area:function(){
- $area.empty();
- if(!hasCity){
- $area.css('display','none');
- }else{
- $area.css('display','');
- if(!options.required){
- $area.append('<option value=""> - 请选择 - </option>');
- }
- if(options.nodata=='disabled'){
- $area.prop('disabled',$.isEmptyObject(area));
- }else if(options.nodata=='hidden'){
- $area.css('display',$.isEmptyObject(area)?'none':'');
- }
- for(i in area){
- $area.append('<option value="'+i+'">'+area[i]+'</option>');
- }
- if(options.area){
- $area.val(options.area);
- }
- }
- }
- };
- //获取当前地理信息
- _api.getInfo = function(){
- var status = {
- direct:!hasCity,
- province:data[options.province]||'',
- city:data[options.city]||'',
- area:data[options.area]||'',
- code:options.area||options.city||options.province
- };
- return status;
- };
- //事件绑定
- $province.on('change',function(){
- options.province = $(this).val();
- options.city = 0;
- options.area = 0;
- updateData();
- format.city();
- options.onChange(_api.getInfo());
- });
- $city.on('change',function(){
- options.city = $(this).val();
- options.area = 0;
- updateData();
- format.area();
- options.onChange(_api.getInfo());
- });
- $area.on('change',function(){
- options.area = $(this).val();
- options.onChange(_api.getInfo());
- });
- //初始化
- updateData();
- format.province();
- if(options.code){
- options.onChange(_api.getInfo());
- }
- getApi(_api);
- }
- });
- });
- };
- }));
|