admin/public/static/ext/layui/lay/modules/autocomplete.js

160 lines
6.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

layui.define(['jquery', 'laytpl', 'layer'], function (e) {
"use strict";
// layui.link('/resource/css/autocomplete.css');
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: ['<div class="layui-form-autocomplete">', '<dl class="layui-anim layui-anim-upbit">', '</dl>', '</div>'].join(''),
layout: ['<dd data-index="{{d.index}}">{{d.text}}</dd>'].join(''),
template_txt: '{{d.text}}',
template_val: '{{d.value}}',
cache: false
},
index: layui.autocomplete ? layui.autocomplete.index + 1e4: 0,
data: {},
},
callback = function() {
var _self = this,
_config = _self.config,
_id = _config.id;
return _id && (callback.config[_id] = _config), {
config: _self.config
}
},
job = function(e) {
var _self = this;
_self.index = ++system.index,
_self.config = $.extend({}, _self.config, system.config, e),
_self.render()
};
job.prototype.config = {
text: {
none: "无数据",
loading: "加载中"
},
response: {
code: 'code',
data: 'data'
},
time_limit: 500,
ajax: [],
_ajax: null,
data: [],
filter: ''
},
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[0] && _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),
_dom = _container.find('dl');
if (!_config.filter) return _self.renderData([]);
if (_config.cache && _config.data[_self.index]) {
var arr = [];
layui.each(_config.data[_self.index], function (i, e) {
if (typeof e === "string") e = new Array(e);
layui.each(e, function (_i, _e) {
if(_e && _e.toString().toLowerCase().indexOf(_config.filter.toLowerCase()) > -1) {
arr.push(e);
return false;
}
});
});
return _self.renderData(arr);
}
if (_config.cache && _config.ajax[_self.index] != undefined) return;
(!_config.cache && _config.ajax[_self.index] != undefined) && _config.ajax[_self.index].abort(), _config.ajax[_self.index] = $.ajax({
type: _config.method || "get",
url: _config.url,
data: {search_text: _config.filter},
dataType: "json",
beforeSend: function () {
_container.addClass(container_focus), _dom.html(['<dd style="text-align: center" autocomplete-load>', _config.text.loading, '</dd>'].join(''))
},
success: function (resp) {
return 0 != eval('resp.' + _config.response.code) ? layer.msg(eval('resp.' + _config.response.data)) : _config.data[_self.index] = eval('resp.' + _config.response.data), _self.renderData(_config.data[_self.index])
},
error: function () {
hint.error("请求失败")
},
complete: function () {
delete _config.ajax[_self.index]
}
})
},
job.prototype.renderData = function (resp) {
var _self = this,
_config = _self.config,
_elem = _config.elem,
_container = _elem.next('.' + container),
_dom = _container.find('dl'),
_list = [];
layui.each(resp, function (i, 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.events = function () {
var _self = this,
_config = _self.config,
_elem = _config.elem,
_container = _elem.next('.' + container),
_dom = _container.find('dl');
_elem.on('focus', function () {
_config.filter = this.value, _config.cache ? _self.pullData() : _self.renderData(_config.data[_self.index])
}).on('input propertychange', function (e) {
var _value = this.value;
clearTimeout(_config._ajax), _config._ajax = 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;
_elem.val(laytpl(_config.template_val).render(_config.data[_self.index][_e.index()])), _config.onselect == undefined || _config.onselect(_config.data[_self.index][_e.index()])
}
_container.removeClass(container_focus);
})
};
callback.config = {},
callback.job = {},
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);
})