zui
Version:
一个基于 Bootstrap 深度定制开源前端实践方案,帮助你快速构建现代跨屏应用。
268 lines (232 loc) • 8.4 kB
JavaScript
/* ========================================================================
* ZUI: messager.js
* http://zui.sexy
* ========================================================================
* Copyright (c) 2014-2016 cnezsoft.com; Licensed MIT
* ======================================================================== */
(function($, window, undefined) {
'use strict';
var id = 0;
var template = '<div class="messager messager-{type} {placement}" style="display: none"><div class="messager-content"></div><div class="messager-actions"></div></div>';
var DEFAULTS = {
type: 'default',
placement: 'top',
time: 4000,
parent: 'body',
// clear: false,
icon: null,
close: true,
// actions: [{icon, name, action, title}],
// contentClass: null,
// cssClass: null,
// onAction: function,
fade: true,
scale: true
};
var all = {};
var Messager = function(message, options) {
if($.isPlainObject(message)) {
options = message;
message = options.message;
}
var that = this;
options = that.options = $.extend({}, DEFAULTS, options);
that.id = options.id || (id++);
var oldMessager = all[that.id];
if(oldMessager) oldMessager.destroy();
all[that.id] = that;
that.message = (options.icon ? '<i class="icon-' + options.icon + ' icon"></i> ' : '') + message;
that.$ = $(template.format(options)).toggleClass('fade', options.fade).toggleClass('scale', options.scale).attr('id', 'messager-' + that.id);
if(options.cssClass) that.$.addClass(options.cssClass);
var hasCloseAction = false;
var $actions = that.$.find('.messager-actions');
var appendAction = function(action) {
var $btn = $('<button type="button" class="action action-' + action.name + '"/>');
if(action.name === 'close') $btn.addClass('close');
if(action.html !== undefined) {
$btn.html(action.html);
}
if(action.icon !== undefined) {
$btn.append('<i class="action-icon icon-' + action.icon + '"/>');
}
if(action.text !== undefined) {
$btn.append('<span class="action-text">' + action.text + '</span>');
}
if(action.tooltip !== undefined) {
$btn.attr('title', action.tooltip).tooltip();
}
$btn.data('action', action);
$actions.append($btn);
};
if(options.actions) {
$.each(options.actions, function(idx, action) {
if(action.name === undefined) action.name = idx;
if(action.name == 'close') hasCloseAction = true;
appendAction(action);
});
}
if(!hasCloseAction && options.close) {
appendAction({name: 'close', html: '×'});
}
that.$.on('click', '.action', function(e) {
var action = $(this).data('action'), result;
if(options.onAction) {
result = options.onAction.call(this, action.name, action, that);
if(result === false) return;
}
if($.isFunction(action.action)) {
result = action.action.call(this, that);
if(result === false) return;
}
that.hide();
e.stopPropagation();
});
that.$.on('click', function(e) {
if(options.onAction) {
var result = options.onAction.call(this, 'content', null, that);
if(result === true) that.hide();
}
});
var $content = that.$.find('.messager-content').html(that.message);
if(options.contentClass) $content.addClass(options.contentClass);
that.$.data('zui.messager', that);
if(options.show && that.message !== undefined) {
that.show();
}
};
Messager.prototype.update = function(message, newOptions) {
var that = this;
var options = that.options;
that.$.removeClass('messager-' + options.type);
if(newOptions) {
options = $.extend(options, newOptions);
}
that.$.addClass('messager-' + options.type);
if(message) {
that.message = (options.icon ? '<i class="icon-' + options.icon + ' icon"></i> ' : '') + message;
that.$.find('.messager-content').html(that.message);
}
};
Messager.prototype.show = function(message, callback) {
var that = this,
options = this.options;
if($.isFunction(message)) {
var oldCallback = callback;
callback = message;
if(oldCallback !== undefined) {
message = oldCallback;
}
}
if(that.isShow) {
that.hide(function() {
that.show(message, callback);
});
return;
}
if(that.hiding) {
clearTimeout(that.hiding);
that.hiding = null;
}
that.update(message);
var placement = options.placement;
var $parent = $(options.parent);
var $holder = $parent.children('.messagers-holder.' + placement);
if(!$holder.length) {
$holder = $('<div/>').attr('class', 'messagers-holder ' + placement).appendTo($parent);
}
$holder.append(that.$);
if(placement === 'center') {
var offset = $(window).height() - $holder.height();
$holder.css('top', Math.max(-offset, offset/2));
}
that.$.show().addClass('in');
if(options.time) {
that.hiding = setTimeout(function() {
that.hide();
}, options.time);
}
that.isShow = true;
callback && callback();
return that;
};
Messager.prototype.hide = function(callback, immediately) {
if(callback === true) {
immediately = true;
callback = null;
}
var that = this;
if(that.$.hasClass('in')) {
that.$.removeClass('in');
var removeMessager = function() {
var $parent = that.$.parent();
that.$.detach();
if(!$parent.children().length) $parent.remove();
callback && callback(true);
};
if(immediately) removeMessager();
else setTimeout(removeMessager, 200);
} else {
callback && callback(false);
}
that.isShow = false;
};
Messager.prototype.destroy = function() {
var that = this;
that.hide(function()
{
that.$.remove();
that.$ = null;
}, true);
delete all[that.id];
};
Messager.all = all;
Messager.DEFAULTS = DEFAULTS;
var hideMessage = function() {
$('.messager').each(function() {
var msg = $(this).data('zui.messager');
if(msg && msg.hide) msg.hide(true);
});
};
var showMessage = function(message, options) {
if(typeof options === 'string') {
options = {
type: options
};
}
options = $.extend({}, options);
if(options.id === undefined) hideMessage();
var msg = all[options.id] || new Messager(message, options);
msg.show();
return msg;
};
var getOptions = function(options) {
return(typeof options === 'string') ? {
placement: options
} : options;
};
var zuiMessager = {
show: showMessage,
hide: hideMessage
};
$.each({
primary : 0,
success : 'ok-sign',
info : 'info-sign',
warning : 'warning-sign',
danger : 'exclamation-sign',
important: 0,
special : 0
}, function(name, icon){
zuiMessager[name] = function(message, options) {
return showMessage(message, $.extend({
type: name,
icon: icon || null
}, getOptions(options)));
};
});
$.zui({
Messager: Messager,
showMessager: showMessage,
messager: zuiMessager
});
}(jQuery, window, undefined));