174 lines
5.5 KiB
Plaintext
174 lines
5.5 KiB
Plaintext
/**
|
||
|
||
@Name:layui.age Tag标签
|
||
@Author:lih
|
||
@License:MIT
|
||
|
||
*/
|
||
|
||
layui.define('jquery', function(exports){
|
||
"use strict";
|
||
|
||
var $ = layui.$
|
||
,MOD_NAME = 'tag',
|
||
TAG_CLASS = '.tag',
|
||
BUTTON_NEW_TAG ='button-new-tag',
|
||
INPUT_NEW_TAG ='input-new-tag',
|
||
TAG_ITEM ='tag-item',
|
||
CLOSE = 'tag-close',
|
||
DEFAULT_SKIN ='layui-btn layui-btn-primary layui-btn-sm'
|
||
,tag = function(){
|
||
this.config = {
|
||
likeHref:'../../layui/modules/tag.css',
|
||
skin: DEFAULT_SKIN,
|
||
tagText:'+ New Tag'
|
||
};
|
||
this.configs = {}
|
||
};
|
||
|
||
//全局设置
|
||
tag.prototype.set = function(options){
|
||
var that = this;
|
||
$.extend(true, that.config, options);
|
||
tag.render();
|
||
return that;
|
||
};
|
||
|
||
//表单事件监听
|
||
tag.prototype.on = function(events, callback){
|
||
return layui.onevent.call(this, MOD_NAME, events, callback);
|
||
};
|
||
|
||
//外部Tag新增
|
||
tag.prototype.add = function(filter, options){
|
||
var tagElem = $(TAG_CLASS + '[lay-filter='+ filter +']')
|
||
call.add(null, tagElem, options);
|
||
call.tagAuto(filter);
|
||
return this;
|
||
};
|
||
|
||
//外部Tag删除
|
||
tag.prototype.delete = function(filter, layid){
|
||
var tagElem = $(TAG_CLASS + '[lay-filter='+ filter +']')
|
||
,tagItemElem = tagElem.find('>.' + TAG_ITEM + '[lay-id="'+ layid +'"]');
|
||
call.delete(null, tagItemElem);
|
||
return this;
|
||
};
|
||
|
||
//基础事件体
|
||
var call = {
|
||
//Tag点击
|
||
tagClick: function(e, index, tagItemElem, options){
|
||
window.event.cancelBubble = true;
|
||
options = options || {};
|
||
var othis = tagItemElem || $(this)
|
||
,index = index || othis.index(othis)
|
||
,parents = othis.parents(TAG_CLASS).eq(0)
|
||
,filter = parents.attr('lay-filter');
|
||
layui.event.call(this, MOD_NAME, 'click('+ filter +')', {
|
||
elem: parents
|
||
,index: index
|
||
});
|
||
}
|
||
//Tag新增事件
|
||
,add: function(e, tagElem, options){
|
||
var filter = tagElem.attr('lay-filter'),
|
||
buttonNewTag = tagElem.children('.' + BUTTON_NEW_TAG),
|
||
index = buttonNewTag.index()
|
||
,newTag = '<button lay-id="'+ (options.id||new Date().getTime()) +'"' +(options.attr ? ' lay-attr="'+ options.attr +'"' : '') +' type="button" class="' + TAG_ITEM + '">'+ (options.text||'unnaming') +'</button>';
|
||
var result = layui.event.call(this, MOD_NAME, 'add('+ filter +')', {
|
||
elem: tagElem
|
||
,index: index
|
||
,othis: newTag
|
||
,valueName:options.text
|
||
})
|
||
if(result === false) return;
|
||
buttonNewTag[0] ? buttonNewTag.before(newTag) : tagElem.append(newTag);
|
||
}
|
||
//Tag输入事件
|
||
,input: function(e, othis){
|
||
var buttonNewTag = othis || $(this)
|
||
,parents = buttonNewTag.parents(TAG_CLASS).eq(0)
|
||
,filter = parents.attr('lay-filter')
|
||
var options = tag.configs[filter] = $.extend({}, tag.config, tag.configs[filter] || {}, options);
|
||
//标签输入框
|
||
var inpatNewTag = $('<div class="' + INPUT_NEW_TAG + '"><input type="text" autocomplete="off" class="layui-input"></div>');
|
||
inpatNewTag.addClass(options.skin);
|
||
buttonNewTag.after(inpatNewTag).remove();
|
||
inpatNewTag.children('.layui-input').on('blur', function () {
|
||
if(this.value){
|
||
var options = {
|
||
text: this.value
|
||
}
|
||
call.add(null, parents, options);
|
||
}
|
||
inpatNewTag.remove();
|
||
call.tagAuto(filter);
|
||
}).focus();
|
||
}
|
||
//Tag删除
|
||
,delete: function(e, othis){
|
||
window.event.cancelBubble = true;
|
||
var tagItem = othis || $(this).parent(), index = tagItem.index()
|
||
,parents = tagItem.parents(TAG_CLASS).eq(0)
|
||
,filter = parents.attr('lay-filter');
|
||
|
||
var result = layui.event.call(this, MOD_NAME, 'delete('+ filter +')', {
|
||
elem: parents
|
||
,index: index
|
||
})
|
||
if(result === false) return;
|
||
tagItem.remove()
|
||
}
|
||
//Tag 自适应
|
||
,tagAuto: function(filter){
|
||
filter = filter || '';
|
||
var options = filter ? tag.configs[filter] || tag.config : tag.config;
|
||
var elemFilter = function(){
|
||
return filter ? ('[lay-filter="' + filter +'"]') : '';
|
||
}();
|
||
$(TAG_CLASS + elemFilter).each(function(){
|
||
var othis = $(this),tagItem = othis.children('.' + TAG_ITEM), buttonNewTag = othis.children('.' + BUTTON_NEW_TAG);
|
||
tagItem.removeClass(DEFAULT_SKIN).addClass(options.skin);
|
||
//允许关闭
|
||
if(othis.attr('lay-allowClose') && tagItem.length){
|
||
tagItem.each(function(){
|
||
var li = $(this);
|
||
if(!li.find('.'+CLOSE)[0]){
|
||
var close = $('<i class="layui-icon layui-unselect '+ CLOSE +'">ဆ</i>');
|
||
close.on('click', call.delete);
|
||
li.append(close);
|
||
}
|
||
});
|
||
}
|
||
//允许新增标签
|
||
if(othis.attr('lay-newTag') && buttonNewTag.length === 0){
|
||
buttonNewTag = $('<button type="button" class="' + BUTTON_NEW_TAG + '"></button>');
|
||
buttonNewTag.on('click', call.input);
|
||
othis.append(buttonNewTag);
|
||
}
|
||
buttonNewTag.html(options.tagText);
|
||
buttonNewTag.removeClass(DEFAULT_SKIN).addClass(options.skin);
|
||
});
|
||
}
|
||
};
|
||
|
||
//初始化元素操作
|
||
tag.prototype.init = function(filter, options){
|
||
layui.addcss(tag.config.likeHref);
|
||
if(filter){
|
||
tag.configs[filter] = $.extend({}, tag.config, tag.configs[filter] || {}, options);
|
||
}
|
||
return call.tagAuto.call(this, filter);
|
||
};
|
||
|
||
tag.prototype.render = tag.prototype.init;
|
||
|
||
var tag = new tag(), dom = $(document);
|
||
tag.render();
|
||
|
||
dom.on('click', '.' + TAG_ITEM, call.tagClick); //tag 单击事件
|
||
exports(MOD_NAME, tag);
|
||
});
|
||
|