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);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
})(); |