基于layer简单的弹层封装

/**
 * 产生长度为32的Guid字符串
 */
function getGuid32() {
    var rt_str = String.fromCharCode(65 + Math.floor(Math.random() * 26));
    for (i = 0; i < 31; ++i) {
        var num = Math.floor(Math.random() * (26 + 26 + 10));
        var ch_str;
        if (num < 10) {
            ch_str = num.toString();
        }
        else if (num < 10 + 26) {
            ch_str = String.fromCharCode(65 + num - 10);
        }
        else {
            ch_str = String.fromCharCode(97 + num - 10 - 26);
        }
        rt_str += ch_str;
    }
    return rt_str;
}

/**
 * 根据guid删除alert-div元素
 * @param Id guid
 */
function delAlertDivById(Id) {
    //等待layer自动处理好
    setTimeout(function () {
        var $alert_div = $(".alert-div[data-guid='" + Id + "']");
        if ($alert_div.length == 0) {
            clearInterval(id);
        }
        else {
            $alert_div.remove();
        }
    }, 1200);
    //上面这个延时数值很重要,因为layer没提供close的回调,所以只能如此等待
}

/**
 * 关闭弹层相关的清理工作
 * @param that myAlert对象
 */
function closeWork(that) {
    clearTimeout(that.autoCloseTimerId);
    layer.close(that.winId);
    delAlertDivById(that.uniqueId);
}

/**
 * 根据myAlert对象组件出jQuery弹窗对象
 * @param that myAlert对象
 */
function buildPopup(that) {
    var baseHtmlStr = "\
                    <div class='alert-div'>\
                        <div class='title'>\
                            <i class='fa icon'></i>\
                            <span class='text'></span>\
                            <i class='fa fa-close icon-close'></i>\
                        </div>\
                        <div class='content text-center'>\
                            <i class='fa fa-5x icon'></i>\
                            <span class='text1'></span>\
                            <span class='text2'></span>\
                        </div>\
                        <div class='control text-center'>\
                            <div class='btn btn-base'></div>\
                        </div>\
                    </div>\
                ";
    var $baseJq = $(baseHtmlStr);

    $baseJq.attr("data-guid", that.uniqueId);

    $baseJq.children(".title").children(".icon").addClass(that.titleIcon);
    $baseJq.children(".content").children(".icon").addClass(that.contentIcon);
    $baseJq.children(".title").children(".text").text(that.title);
    $baseJq.children(".content").children(".text1").text(that.text);
    $baseJq.children(".content").children(".text2").text(that.summary);
    $baseJq.children(".control").children(".btn-base").text(that.okBtnText);

    $baseJq.children(".title").children(".icon-close").click(that.canClose ? that.closeBtnFunction : function () { });
    $baseJq.children(".control").children(".btn-base").click(that.okBtnFunction);

    return $baseJq;
}

/**
 * 根据配置对象对于myAlert对象进行配置
 * @param dstObj 目标对象,myAlert对象
 * @param cfgObj 配置对象
 */
function defaultConfig(dstObj, cfgObj) {
    if (cfgObj == undefined) {
        cfgObj = new Object();
    }

    dstObj.uniqueId = cfgObj.uniqueId || getGuid32();

    dstObj.title = cfgObj.title || "提示";
    dstObj.text = cfgObj.text || "确认?";
    dstObj.summary = cfgObj.summary || "确认请按下方按钮";
    dstObj.okBtnText = cfgObj.okBtnText || "确认";

    dstObj.titleIcon = cfgObj.titleIcon || "fa-info-circle";
    dstObj.contentIcon = cfgObj.contentIcon || "fa-exclamation-circle";

    if (cfgObj.canClose == undefined) {
        dstObj.canClose = true;
    }
    else {
        dstObj.canClose = cfgObj.canClose;
    }
    dstObj.autoCloseTimer = cfgObj.autoCloseTimer || -1;

    dstObj.okBtnFunction = cfgObj.okBtnFunction || function () {
        closeWork(dstObj);
    };
    dstObj.closeBtnFunction = cfgObj.closeBtnFunction || function () {
        closeWork(dstObj);
    };
    dstObj.autoCloseTimerId = -1;
    dstObj.autoCloseFunction = cfgObj.autoCloseFunction || function () {
        closeWork(dstObj);
    };

    //存储layer返回的弹层id
    dstObj.winId = -1;
}

/**
 * myAlert对象构造函数
 * @param cfgObj myAlert配置对象
 */
function myAlert(cfgObj) {

    defaultConfig(this, cfgObj);

    //弹出弹层方法
    this.show = function () {
        if ($(".alert-div[data-guid='" + this.uniqueId + "']").length > 0) {
            return;
        }

        var $baseJq = buildPopup(this);

        $("body").append($baseJq);

        /**
         * 实际弹窗部分
         */
        var $popup_dom = $baseJq;
        this.winId = layer.open({
            id: this.uniqueId,
            type: 1,
            closeBtn: 0,
            title: false,
            content: $popup_dom,
            area: [$popup_dom.width(), $popup_dom.height()]
        });

        if (this.canClose) {
            if (this.autoCloseTimer > -1) {
                var that = this;
                this.autoCloseTimerId = setTimeout(function () {
                    that.autoCloseFunction();
                }, this.autoCloseTimer);
            }
        }
    };
}

 

 

.layui-layer {
    background-color: rgba(255, 255, 255, 0) !important;
}

.alert-div {
    position: relative;
    width: 740px;
    height: 480px;
    border: 1px solid #f2af6f;
    border-radius: 6px;
    font-family: 'Microsoft YaHei UI';
    margin: 0px;
    padding: 0px;
    background-color: white;
    overflow-y: hidden;
    overflow-x: hidden;
    display: none;
}

    .alert-div .title {
        background: linear-gradient(to bottom, #f2af6f 10%, #f3a02c 90%);
        font-size: 48px;
        height: 70px;
    }

        .alert-div .title .icon {
            margin: 0px 0px 10px 14px;
        }

        .alert-div .title .text {
            position: absolute;
            top: 9px;
            left: 67px;
            font-size: 34px;
            font-weight: bold;
        }

        .alert-div .title .icon-close {
            margin: 8px 12px 10px 14px;
            float: right;
        }

    .alert-div .content {
        height: 270px;
        padding-top: 50px;
    }

        .alert-div .content .icon {
            display: block;
        }

        .alert-div .content .text1 {
            color: black;
            font-size: 38px;
            margin-top: 40px;
            display: block;
        }

        .alert-div .content .text2 {
            color: #444;
            font-size: 24px;
            margin-top: 10px;
            display: block;
        }

    .alert-div .control {
        height: 140px;
    }

        .alert-div .control .btn-base {
            border: solid 1px #f2af6f;
            border-radius: 6px;
            font-size: 36px;
            font-weight: bold;
            padding-left: 40px;
            padding-right: 40px;
            margin-top: 35px;
            background: linear-gradient(to bottom, #f2af6f 10%, #f3a02c 90%);
        }

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="Content/bootstrap.css" />
    <link rel="stylesheet" href="Content/font-awesome.css" />
    <link rel="stylesheet" href="layer/skin/default/layer.css" />
    <link rel="stylesheet" href="Content/trml-myAlert.css" />
</head>
<body>
    <div class="container" style="margin-top: 20px;">
        <input type="button" class="btn btn-primary btn-test1" value="测试1" />
    </div>
    <script src="Scripts/jquery-3.1.1.js"></script>
    <script src="Scripts/bootstrap.js"></script>
    <script src="layer/layer.js"></script>
    <script src="Scripts/trml-myAlert-jq.js"></script>
    <script>
        $(".btn-test1").click(function () {
            var tstAlert = new myAlert({
                uniqueId: "gushihao",
                okBtnFunction: function () {
                    alert("哈哈");
                    closeWork(tstAlert);
                },
                autoCloseTimer: 10000,
                autoCloseFunction: function () {
                    alert("我要自动关闭了!");
                    closeWork(tstAlert);
                },
                closeBtnFunction: function () {
                    alert("你点击了关闭按钮");
                    closeWork(tstAlert);
                }
            });
            tstAlert.show();
        });
    </script>
</body>
</html>

 

posted @ 2017-09-07 10:16  鸡毛巾  阅读(545)  评论(0编辑  收藏  举报