前端js弹层组件

/**
 *  全局展示操作反馈信息:例
 *  import message from 'message';
 *  message.error('这是一条普通的提醒', 2000);
 */

let defaultDuration = 2; // 默认停留时间 单位:s
let tipBoxInstance; // 唯一实例
let setTimeoutPointer; // settimeout指针
let onHideFuncQueue = {};// 视图隐藏时的回调函数HASH MAP
let onHideFuncID = 0;// 视图隐藏时的回调函数ID

function getOnHideFuncID() {
    // 临界值判断
    if (onHideFuncID === Number.MAX_VALUE) {
        onHideFuncID = 0;
    }
    return onHideFuncID++;
}

function getTipBoxInstance(type, textTip) {
    if (tipBoxInstance === void 0 || tipBoxInstance === null) {
        if (window.jQuery === void 0 || window.jQuery === null) {
            throw "The jQeury framework is missing";
        }
        if(!type){
            return;
        }
        let content;
        switch (type) {
            case 'success':
                content =
                    `<div class="c-global-tips-pack">
                        <div class="c-global-tips">
                            <span class="l-flex_align-center">
                                <i class="i-icon i-icon--success"></i>
                            </span>
                            <span class="tip-text"></span>
                        </div>
                    </div>`;
                break;
            case 'error':
                content =
                    `<div class="c-global-tips-pack">
                        <div class="c-global-tips">
                            <span class="l-flex_align-center">
                                <i class="i-icon i-icon--faile-02"></i>
                            </span>
                            <span class="tip-text"></span>
                        </div>
                    </div>`;
                break;
            default:
                break;
        }
        tipBoxInstance = {
            isShow: false,// 是否显示
            type: undefined, // 显示类型
            textTip: undefined, // 提示文字
            show: function () {
                if (this.isShow === true) {
                    return;
                }
                window.jQuery(document.body).append(this.$dom);
                this.isShow = true;
            },
            removeFromSuperView: function () { // 从父级视图移除
                if (this.isShow === false) {
                    return;
                }
                this.$dom.remove();
                this.isShow = false;
            },
            $dom: window.jQuery(
                content
            )
        };
    }
    const _$textP = tipBoxInstance.$dom.find(".tip-text");
    _$textP.text(textTip);
    return tipBoxInstance;
}

function show(content, duration = defaultDuration, type, onHide) {
    let instance = getTipBoxInstance(type, content);
    instance.show();
    // 清除之前的隐藏视图计划任务
    clearSettimeoutQueue();
    // 触发所有回调函数
    emitAllOnnHideFuncQueue();
    // 将回调函数加入队列
    let _onHideFuncID = addOnnHideFuncQueue(onHide);
    const _hideViewFunc = instance.removeFromSuperView.bind(instance);
    // 在视图隐藏时的计划任务
    const _task = () => {
        // 隐藏视图
        _hideViewFunc();
        // 触发回调函数
        emitOnnHideFuncQueue(_onHideFuncID);
    };
    setTimeoutPointer = setTimeout(_task, duration * 1000);
    return ()=>{
        // 立即执行在视图隐藏时的计划任务
        _task();
        // 取消在视图隐藏时的计划任务
        clearTimeout(setTimeoutPointer);
    };
}

// 加入回调函数队列
function addOnnHideFuncQueue(onHideCallbackFunc) {
    let _onHideFuncID;
    if (onHideCallbackFunc && typeof onHideCallbackFunc === "function") {
        _onHideFuncID = getOnHideFuncID();
        onHideFuncQueue[_onHideFuncID] = onHideCallbackFunc;
    }
    return _onHideFuncID;
}

// 触发回调函数
function emitOnnHideFuncQueue(id) {
    if(onHideFuncQueue[id]){
        onHideFuncQueue[id]();
        delete onHideFuncQueue[id];
    }
}

// 触发所有回调函数
function emitAllOnnHideFuncQueue() {
    for(let id in onHideFuncQueue){
        emitOnnHideFuncQueue(id);
    }
}

function clearSettimeoutQueue() {
    if (setTimeoutPointer !== void 0 || setTimeoutPointer !== null) {
        clearTimeout(setTimeoutPointer);
        setTimeoutPointer = null;
    }
}

export default {
    success(content, duration, onHide) {
        return show(content, duration, 'success', onHide);
    },
    error(content, duration, onHide) {
        return show(content, duration, 'error', onHide);
    },
    destroy() {
        if (tipBoxInstance !== void 0 || tipBoxInstance !== null) {
            clearSettimeoutQueue();
            tipBoxInstance.removeFromSuperView(); // 从父级视图移除
            tipBoxInstance = null;
        }
    },
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值