121 lines
3.4 KiB
JavaScript
121 lines
3.4 KiB
JavaScript
|
|
|||
|
// 通知对话框分组
|
|||
|
(function () {
|
|||
|
|
|||
|
// _notifySpace: 消息框之间的间距
|
|||
|
// _notifies: 存放当前正在显示的对话框列表
|
|||
|
var _orderNumber = 1, _notifySpace = 5, _notifies = [];
|
|||
|
|
|||
|
// 对话框关闭处理函数
|
|||
|
function onNotifyHide() {
|
|||
|
// 先清空之前尚未完成的动画
|
|||
|
clearNotifiesAnimation();
|
|||
|
|
|||
|
var notify = this;
|
|||
|
var notifyHeight = notify.el.outerHeight(true) + _notifySpace;
|
|||
|
var notifyIndex = $.inArray(notify, _notifies);
|
|||
|
_notifies.splice(notifyIndex, 1);
|
|||
|
|
|||
|
var count = _notifies.length;
|
|||
|
if (count) {
|
|||
|
for (var i = notifyIndex; i < count; i++) {
|
|||
|
var item = _notifies[i];
|
|||
|
item.top -= notifyHeight;
|
|||
|
item.el.animate({
|
|||
|
'top': item.top
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
// 按照 notify.top 重新排序
|
|||
|
_notifies.sort(function (a, b) {
|
|||
|
return a.top - b.top;
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 所有对话框下移
|
|||
|
function moveNotifiesDown(newNotify, fn) {
|
|||
|
// 先清空之前尚未完成的动画
|
|||
|
clearNotifiesAnimation();
|
|||
|
|
|||
|
var count = _notifies.length, finished = 0;
|
|||
|
if (!count) {
|
|||
|
fn.apply(window);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var notifyHeight = newNotify.el.outerHeight(true) + _notifySpace;
|
|||
|
for (var i = 0; i < count; i++) {
|
|||
|
var item = _notifies[i];
|
|||
|
item.top += notifyHeight;
|
|||
|
item.el.animate({
|
|||
|
'top': item.top
|
|||
|
}, function () {
|
|||
|
// 动画完成后执行的函数
|
|||
|
finished++;
|
|||
|
|
|||
|
if (finished >= count) {
|
|||
|
fn.apply(window);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 停止动画,并回调
|
|||
|
function clearNotifiesAnimation() {
|
|||
|
var count = _notifies.length;
|
|||
|
if (count) {
|
|||
|
for (var i = 0; i < count; i++) {
|
|||
|
var item = _notifies[i];
|
|||
|
var itemEl = item.el;
|
|||
|
if (itemEl.is(":animated")) {
|
|||
|
itemEl.stop(false, true);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 获取对话框元素的top属性
|
|||
|
function calcNotifyTop() {
|
|||
|
var top = _notifySpace;
|
|||
|
if (_notifies.length) {
|
|||
|
var lastNotify = _notifies[_notifies.length - 1];
|
|||
|
top += lastNotify.top + lastNotify.el.outerHeight(true);
|
|||
|
}
|
|||
|
return top;
|
|||
|
}
|
|||
|
|
|||
|
// 公开方法
|
|||
|
window.showNotifyGroup = function (options, newestOnTop) {
|
|||
|
// 创建一个消息对话框实例
|
|||
|
$.extend(options, {
|
|||
|
cls: 'notify-group-item', // 自定义样式
|
|||
|
constrainInitialSize: false, // 不限制初始大小,因为本示例的消息框可能会超出页面边界
|
|||
|
positionX: 'right',
|
|||
|
listeners: {
|
|||
|
hide: onNotifyHide
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
if (newestOnTop) {
|
|||
|
// 最新的显示在最上方,需要先隐藏,等 moveNotifiesDown 之后再显示
|
|||
|
options.hidden = true;
|
|||
|
options.top = _notifySpace;
|
|||
|
} else {
|
|||
|
options.top = calcNotifyTop();
|
|||
|
}
|
|||
|
|
|||
|
var notify = F.notify(options);
|
|||
|
|
|||
|
if (newestOnTop) {
|
|||
|
moveNotifiesDown(notify, function () {
|
|||
|
notify.show();
|
|||
|
});
|
|||
|
_notifies.splice(0, 0, notify);
|
|||
|
} else {
|
|||
|
_notifies.push(notify);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
})();
|