layui.define(['jquery', 'laytpl', 'layer'], function (e) { "use strict"; var hint = layui.hint(), $ = layui.jquery, laytpl = layui.laytpl, layer = layui.layer, module = 'autocomplete', filter = 'layui-autocomplete', container = 'layui-form-autocomplete', container_focus = 'layui-form-autocomplete-focus', system = { config: { template: ['
', '
', '
', '
'].join(''), layout: ['
{{d.text}}
'].join(''), template_txt: '{{d.text}}', template_val: '{{d.value}}', cache: false }, data: {} }, callback = function () { var _self = this, _config = _self.config; return { call: function (handle, params) { if (!_self.handles[handle]) return hint.error(handle + " handle is not defined"); _self.handles[handle].call(_self, params) } } }, job = function (e) { var _self = this; _self.config = $.extend({}, _self.config, system.config, e); _self.render(); }; job.prototype.config = { response: { code: 'code', data: 'data', msg: 'msg' }, request: { keywords: 'keywords' }, statusCode: 0, time_limit: 300, pullTimer: null, data: {}, temp_data: {}, params: {}, filter: '', method: 'get', ajaxParams: {} } job.prototype.render = function () { var _self = this, _config = _self.config; if (_config.elem = $(_config.elem), _config.where = _config.where || {}, !_config.elem[0]) return _self; var _elem = _config.elem, _container = _elem.next('.' + container), _html = _self.elem = $(laytpl(_config.template).render({})); _config.id = _self.id, _container && _container.remove(), _elem.attr('autocomplete', 'off'), _elem.after(_html); _self.events() } job.prototype.pullData = function () { var _self = this, _config = _self.config, _elem = _config.elem, _container = _elem.next('.' + container); if (!_config.filter) return _self.renderData([]); if ((_config.cache || !_config.url) && _config.data instanceof Object && Object.keys(_config.data).length > 0) return _self.renderData(_config.data); var keywords = _config.request.keywords var params = { t: new Date().getTime() } params[keywords] = _config.filter; var $loading = $(''); $loading.attr('style', [ 'position:absolute', 'left:' + (_elem.offset().left + _elem.outerWidth() - 20) + 'px', 'top:' + _elem.offset().top + 'px', 'height:' + _elem.height() + 'px', 'line-height:' + _elem.height() + 'px' ].join(';')); $loading.appendTo('body'); //获取数据 var myPK = _config.url; var mapExt = new Entity("BP.Sys.MapExt", myPK); var data = GetDataTableByDB(mapExt.Tag4, mapExt.DBType, mapExt.FK_DBSrc, _config.filter); $loading.remove(); _config.data = data; _self.renderData(_config.data); } job.prototype.renderData = function (resp) { var _self = this, _config = _self.config, _elem = _config.elem, _container = _elem.next('.' + container), _dom = _container.find('dl'), _list = []; _config.temp_data = []; layui.each(resp, function (i, e) { if (_config.cache) { if (e instanceof Object) { layui.each(e, function (_i, _e) { if (_e && _e.toString().toLowerCase().indexOf(_config.filter.toLowerCase()) > -1) { _config.temp_data.push(e), _list.push(laytpl(_config.layout).render({ index: i, text: laytpl(_config.template_txt).render(e) })); return true; } }); } else { if (e && e.toString().toLowerCase().indexOf(_config.filter.toLowerCase()) > -1) { _config.temp_data.push(e), _list.push(laytpl(_config.layout).render({ index: i, text: laytpl(_config.template_txt).render(e) })); } } } else { _config.temp_data.push(e), _list.push(laytpl(_config.layout).render({ index: i, text: laytpl(_config.template_txt).render(e) })); } }); _dom.html(_list.join('')), _list.length > 0 ? _container.addClass(container_focus) : _container.removeClass(container_focus) } job.prototype.handles = { addData: function (data) { var _self = this, _config = _self.config; if (data instanceof Array) { _config.data = _config.data.concat(data) } else { _config.data.push(data) } }, setData: function (data) { var _self = this, _config = _self.config; _config.data = data; } } job.prototype.events = function () { var _self = this, _config = _self.config, _elem = _config.elem, _container = _elem.next('.' + container), _dom = _container.find('dl'); _elem.unbind('focus').unbind('input propertychange').on('focus', function () { _config.filter = this.value, _self.renderData(_config.data) }).on('input propertychange', function (e) { var _value = this.value; clearTimeout(_config.pullTimer), _config.pullTimer = setTimeout(function () { _config.filter = _value, _self.pullData() }, _config.time_limit) }) $(document).on('click', function (e) { var _target = e.target, _item = _dom.find(_target), _e = _item.length > 0 ? _item.closest('dd') : undefined; if (_target === _elem[0]) return false; if (_e !== undefined) { if (_e.attr('autocomplete-load') !== undefined) return false; var curr_data = _config.temp_data[_e.index()] _elem.val(laytpl(_config.template_val).render(curr_data)), _config.onselect == undefined || _config.onselect(curr_data) } _container.removeClass(container_focus); }) } system.init = function (e, c) { var c = c || {}, _self = this, _elems = $(e ? 'input[lay-filter="' + e + '"]' : 'input[' + filter + ']'); _elems.each(function (_i, _e) { var _elem = $(_e), _lay_data = _elem.attr('lay-data'); try { _lay_data = new Function("return " + _lay_data)() } catch (ex) { return hint.error("autocomplete元素属性lay-data配置项存在语法错误:" + _lay_data) } var _config = $.extend({ elem: this }, system.config, c, _lay_data); _config.url == undefined && (_config.data == undefined || _config.length === 0) && hint.error("autocomplete配置有误,缺少获取数据方式"); system.render(_config); }) } system.render = function (e) { var j = new job(e); return callback.call(j) } system.init(), e(module, system); })