/** common.js By Beginner Emain:zheng_jinfan@126.com HomePage:http://www.zhengjinfan.cn */ layui.define(['jquery'], function(exports) { "use strict"; var jQuery = layui.jquery; /** * jquery.citys.js 1.0 * http://jquerywidget.com */ ; (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: 'http://passer-by.com/data_location/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(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(''); } for(i in province) { $province.append(''); } if(options.province) { $province.val(options.province); } this.city(); }, city: function() { $city.empty(); if(!options.required) { $city.append(''); } 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(''); } 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(''); } 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(''); } 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(); getApi(_api); } }); }); }; })(jQuery); exports('city', null); });