UNPKG

@tower1229/flow-ui

Version:

Highly customizable UI framework based Seajs/jQuery

217 lines (203 loc) 6.26 kB
/* * name: city-selector.js * version: v1.0.2 * update: loading始终提示bug * date: 2017-04-06 */ define('city-select', function(require, exports, module) { 'use strict'; seajs.importStyle('\ .city-selector-warp{display:none; position:absolute;z-index:99;background:#fff;border:1px solid #e5eaee;padding:0 15px;width:600px;}\ .city-selector-head{position:relative; height:40px;line-height:40px;border-bottom:1px solid #e5eaee;}\ .city-selector-head-back{display:inline-block;cursor:pointer; visibility:hidden;}\ .city-selector-head-close{position:absolute;right:0;top:0;padding:0 .5em;cursor:pointer;font-family:tahoma;font-size:2em;}\ .city-selector-head-back:hover,.city-selector-head-close:hover{color:#ff6e0a;}\ .city-selector-items{overflow:hidden;}\ .city-selector-item{float:left; cursor:pointer;margin:1em;}\ .city-selector-item:hover,.city-selector-items.cur{color:#ff6e0a;}', module.uri); require('tip'); var $ = window.$ || require('jquery'), base = require('base'), def = { el: null, textKey: 'name', subKeys: ['city', 'area'], data: null, readOnly: true, onSelect: null }, template = '<div class="city-selector-warp">\ <div class="city-selector-head">\ <div class="city-selector-head-back">返回</div>\ <div class="city-selector-head-close">×</div>\ </div>\ <div class="city-selector-body">\ <div class="city-selector-items"></div>\ </div>\ </div>', cityData, citySelectorTarget = $('#citySelectorTarget'), citySelectResult = [], checkStatus = function(selectItem) { //返回按钮状态 if (citySelectResult.length) { citySelectorTarget.find('.city-selector-head-back').css('visibility', 'visible'); } else { citySelectorTarget.find('.city-selector-head-back').css('visibility', 'hidden'); } }, render = function(citySelectorThis, citySelectCallback) { var _html = '', _data, _result = [], opt; citySelectorTarget.css('zIndex', base.getIndex()); if (citySelectorThis && citySelectorThis.length) { citySelectorTarget.data('el', citySelectorThis); } else { citySelectorThis = citySelectorTarget.data('el'); } opt = citySelectorThis.data('cityselecteropt'); if (typeof citySelectCallback === 'function') { citySelectorTarget.data('cb', citySelectCallback); } else { citySelectCallback = citySelectorTarget.data('cb'); } if (!citySelectorThis) { return console.warn('render() 异常!'); } if (citySelectResult.length) { var _cache = cityData; $.each(citySelectResult, function(i, e) { var thisData = base.deepcopy(_cache[e]); _cache = _cache[e][opt.subKeys[i]]; delete thisData[opt.subKeys[i]]; _result.push(thisData); }); _data = _cache; } else { _data = cityData; } if ($.isArray(_data) && _data.length) { $.each(_data, function(i, e) { _html += ('<span class="city-selector-item" data-index="' + i + '">' + e[opt.textKey] + '</span>'); }); citySelectorTarget.find('.city-selector-items').html(_html).end().css({ left: citySelectorThis.offset().left, top: citySelectorThis.offset().top + citySelectorThis.outerHeight(), display: 'block' }); } else { //最终一级 citySelectorThis.data('result', _result); if (typeof(citySelectCallback) === 'function') { citySelectCallback.call(citySelectorThis, _result); } citySelectResult = []; citySelectorTarget.find('.city-selector-head-close').trigger('click'); } }; base.ajaxSetup($); if (!citySelectorTarget.length) { citySelectorTarget = $(template).attr('id', 'citySelectorTarget').appendTo('body'); } citySelectorTarget.on('click', '.city-selector-head-close', function(e) { //关闭 e.preventDefault(); citySelectorTarget.hide(); }).on('click', '.city-selector-head-back', function(e) { //返回 e.preventDefault(); if (citySelectResult.length) { citySelectResult.pop(); } checkStatus(); render(); }).on('click', '.city-selector-item', function(e) { //前进 e.preventDefault(); citySelectResult.push($(this).data('index')); checkStatus(); render(); }); var citySelect = function(config) { var opt = $.extend({}, def, config || {}); if (!$(opt.el).length) { return console.warn('citySelect():缺少el参数!'); } if (!opt.textKey || !opt.textKey.split) { return console.warn('citySelect(): 缺少textKey参数!'); } if ($.isArray(opt.data)) { cityData = base.deepcopy(opt.data); } else if (!opt.data || !opt.data.split) { return console.warn('citySelect(): data配置错误!'); } $(opt.el).each(function(i, e) { var $this = $(e); if (!$this.data('cityselecteropt')) { $this.data('cityselecteropt', opt); if (opt.readOnly && ($this.is('input') || $this.is('textarea'))) { $this.on('focus', function(e) { $this.blur(); }); } $this.on('click', function(e) { e.preventDefault(); if (cityData) { render($this, opt.onSelect); } else { var loading = $this.tip('加载中...', { place: 'bottom-center', modal: true, show: true }); $.ajax({ url: opt.data, localCache: 1e6, success: function(res) { loading.destroy(); if (res.status === 'Y') { cityData = res.data; render($this, opt.onSelect); } else { console.warn('city-select数据加载失败'); } } }); } }); } }); return { val: function(value){ if(value && value.split){ value = value.split(','); citySelectResult = []; if (value.length) { var _cache = cityData; $.each(value, function(i, e) { $.each(_cache, function(di, data){ if(e === data[opt.textKey]){ var thisData = base.deepcopy(data); _cache = _cache[di][opt.subKeys[i]]; delete thisData[opt.subKeys[i]]; citySelectResult.push(di); } }); }); return render($(opt.el), opt.onSelect); } }else{ return $(opt.el).data('result'); } } }; }; $.fn.citySelect = function(config) { return citySelect($.extend({ el: this }, config || {})); }; module.exports = citySelect; });