代码功能更新
This commit is contained in:
+159
@@ -0,0 +1,159 @@
|
||||
layui.define(['jquery'], function(exports) {
|
||||
var $ = layui.jquery
|
||||
var CLS_DROPDOWN = 'layui-dropdown'
|
||||
var CLS_DROPDOWN_RIGHT = 'layui-dropdown-direright'
|
||||
var CLS_SELECT = 'layui-dropdown-select'
|
||||
var CLS_OPTION = 'layui-dropdown-option'
|
||||
var CLS_TITLE = 'layui-dropdown-title'
|
||||
var CLS_ARROW = 'layui-dropdown-arrow-up'
|
||||
var HTML_DROPDOWN = '<div class="' + CLS_DROPDOWN + '"><div>'
|
||||
var DEPTH = 0
|
||||
var INDEX = 0
|
||||
var operationConfigData;
|
||||
|
||||
var Class = function(config) {
|
||||
this.config = $.extend({}, this.config, config);
|
||||
this.render(config);
|
||||
};
|
||||
|
||||
Class.prototype.config = {
|
||||
width: 150,
|
||||
trigger: 'click'
|
||||
};
|
||||
|
||||
Class.prototype.dropdownElem = '';
|
||||
Class.prototype.exists = false;
|
||||
Class.prototype.depth = 0;
|
||||
Class.prototype.index = 0;
|
||||
Class.prototype.render = function(config) {
|
||||
var self = this;
|
||||
if (typeof this.config.elem == 'string') {
|
||||
$(document).on('click', this.config.elem, event);
|
||||
} else {
|
||||
this.config.elem.click(event);
|
||||
}
|
||||
|
||||
function event(e) {
|
||||
e.stopPropagation()
|
||||
|
||||
if (self.dropdownElem == '') {
|
||||
INDEX += 1
|
||||
self.index = INDEX
|
||||
|
||||
var dropdown = $(HTML_DROPDOWN).attr('lay-index', self.index)
|
||||
$('.' + CLS_DROPDOWN + '[lay-index="' + self.index + '"]').remove()
|
||||
|
||||
dropdown.html(self.createOptionsHtml(config))
|
||||
$('body').prepend(dropdown)
|
||||
// dropdown.on('click', '.' + CLS_OPTION, function(e) {
|
||||
// e.stopPropagation()
|
||||
// if ($.isFunction(config.click)) {
|
||||
// config.click($(this).attr('lay-action'), $(this), e)
|
||||
// dropdown.hide()
|
||||
// }
|
||||
// })
|
||||
self.dropdownElem = dropdown
|
||||
self.dropdownSelect = dropdown.find('.' + CLS_SELECT)
|
||||
}
|
||||
|
||||
var dropdown = self.dropdownElem
|
||||
dropdown.css('z-index','999');
|
||||
|
||||
var top = $(this).offset().top + $(this).height() + 12 - $(document).scrollTop()
|
||||
var left = $(this).offset().left
|
||||
dropdown.css({
|
||||
top: top - 10
|
||||
})
|
||||
var offsetWidth = (self.depth + 1) * self.config.width
|
||||
|
||||
if (left + offsetWidth > $(window).width()) {
|
||||
dropdown
|
||||
.addClass('layui-dropdown-right')
|
||||
.css('left', left - dropdown.width() + $(this).width())
|
||||
self.dropdownSelect.css({ left: 'auto', right: self.config.width })
|
||||
} else {
|
||||
dropdown.removeClass('layui-dropdown-right').css('left', left)
|
||||
self.dropdownSelect.css({ right: 'auto', left: self.config.width })
|
||||
}
|
||||
|
||||
$('body').one('click', function(e) {
|
||||
dropdown.hide();
|
||||
dropdown.css('z-index','-1');
|
||||
dropdown.stop().animate(
|
||||
{
|
||||
top: '-=10',
|
||||
opacity: 0
|
||||
},
|
||||
250
|
||||
)
|
||||
});
|
||||
|
||||
dropdown
|
||||
.show()
|
||||
.stop()
|
||||
.animate(
|
||||
{
|
||||
top: '+=10',
|
||||
opacity: 1
|
||||
},
|
||||
250
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
Class.prototype.createOptionsHtml = function(data, depth) {
|
||||
depth = depth || 0
|
||||
var self = this
|
||||
var width = self.config.width + 'px;'
|
||||
var html =
|
||||
'<div class="' +
|
||||
CLS_SELECT +
|
||||
'" style="width:' +
|
||||
width +
|
||||
(depth > 0 ? 'left:' + width : '') +
|
||||
'">'
|
||||
if (depth == 0) {
|
||||
html += '<div class="' + CLS_ARROW + '"></div>'
|
||||
}
|
||||
layui.each(data.options, function(i, option) {
|
||||
var options = option.options || [];
|
||||
html +=
|
||||
'<div ' +
|
||||
'class="' + CLS_OPTION +' operationDropdown"' +
|
||||
'data-option=\''+JSON.stringify(option)+'\'' +
|
||||
'title=\''+option.title+'\'' +
|
||||
'>' +
|
||||
'<p class="' + CLS_TITLE +' layui-elip">' +
|
||||
'<span class="layui-icon ' + option.icon + '"></span>' + option.title +
|
||||
'</p>' +
|
||||
(options.length > 0
|
||||
? '<i class="layui-icon layui-icon-right"></i>'
|
||||
: '');
|
||||
option.options = option.options || [];
|
||||
if (option.options.length > 0){
|
||||
html += self.createOptionsHtml(option, depth + 1);
|
||||
}
|
||||
html += '</div>';
|
||||
if (self.depth < depth) self.depth = depth
|
||||
});
|
||||
html += '</div>';
|
||||
return html
|
||||
};
|
||||
|
||||
var self = {
|
||||
render: function(config) {
|
||||
operationConfigData = config;
|
||||
new Class(config);
|
||||
}
|
||||
};
|
||||
|
||||
$(document).off("click", ".operationDropdown").on("click", ".operationDropdown", function () {
|
||||
var obj = $(this);
|
||||
var option = obj.data("option");
|
||||
if(typeof operationConfigData["click"] === "function"){
|
||||
operationConfigData["click"](option);
|
||||
}
|
||||
});
|
||||
|
||||
exports('operationDropdown', self)
|
||||
});
|
||||
Reference in New Issue
Block a user