【原创】基于Bootstrap的Modal二次封装

前言

Bootstrap:Twitter推出的一个开源的用于前端开发的工具包。它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架

官方网站:http://www.bootcss.com/

1.Bootstrap Modals(模态框)基本用法

使用bootstrap之前需要应用jquery.js和bootstrap.js以及bootstrap.css 注意:最新版的bootstrap需要和jquery1.9以上版本配合使用

    <!-- 按钮触发模态框 -->
    <button class="btn btn-primary btn-lg" data-toggle="modal"
            data-target="#myModal">
        开始演示模态框
    </button>
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog"
         aria-labelledby="myModalLabel" aria-hidden="true">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close"
                            data-dismiss="modal" aria-hidden="true">
                        &times;
                    </button>
                    <h4 class="modal-title" id="myModalLabel">
                        模态框(Modal)标题
                    </h4>
                </div>
                <div class="modal-body">
                    在这里添加一些文本
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default"
                            data-dismiss="modal">
                        关闭
                    </button>
                    <button type="button" class="btn btn-primary">
                        提交更改
                    </button>
                </div>
            </div>
        </div>
    </div>

当我们点击button的时候会触发Modal,效果如下图所示

2.0先看我们的封装代码

$(function () {
    if ($.fn.modal) {
        $.fn.modal.defaults.spinner = $.fn.modalmanager.defaults.spinner =
    ‘<div class="loading-spinner" style="width: 200px; margin-left: -100px;">‘ +
    ‘<div class="progress progress-striped active">‘ +
      ‘<div class="progress-bar" style="width: 100%;"></div>‘ +
    ‘</div>‘ +
    ‘</div>‘;

        $.fn.modalmanager.defaults.resize = true;
    }

    window.Modal = function () {
        var _tplHtml = ‘<div class="modal created-modal" id="[Id]">‘ +
                                        ‘<div class="modal-header">‘ +
                                            ‘<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>‘ +
                                            ‘<h5 class="modal-title"><i class="icon-exclamation-sign"></i> [Title]</h5>‘ +
                                        ‘</div>‘ +
                                        ‘<div class="modal-body small">‘ +
                                            ‘<p>[Message]</p>‘ +
                                        ‘</div>‘ +
                                        ‘<div class="modal-footer" >‘ +
                                            ‘<button type="button" class="btn btn-primary ok" data-dismiss="modal">[BtnOk]</button>‘ +
                                            ‘<button type="button" class="btn btn-default cancel" data-dismiss="modal">[BtnCancel]</button>‘ +
                                        ‘</div>‘ +
                            ‘</div>‘;

        var _tplLoadHtml = ‘<div class="modal created-modal" id="[Id]">‘ +
                                                ‘<div class="modal-header">‘ +
                                                    ‘<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>‘ +
                                                    ‘<h5 class="modal-title">[Title]</h5>‘ +
                                                ‘</div>‘ +
                                                ‘<div class="modal-body small">‘ +
                                                    ‘<iframe src="[Url]" frameborder="0" width="100%" height="[Height]px" style="padding:0px; margin:0px;"></iframe>‘ +
                                                ‘</div>‘ +
                                        ‘</div>‘;

        var reg = new RegExp("\\[([^\\[\\]]*?)\\]", ‘igm‘);

        var _alert = function (options) {
            var id = _dialog(options);
            var modal = $(‘#‘ + id);
            modal.find(‘.ok‘).removeClass(‘btn-success‘).addClass(‘btn-primary‘);
            modal.find(‘.cancel‘).hide();

            return {
                id: id,
                on: function (callback) {
                    if (callback && callback instanceof Function) {
                        modal.find(‘.ok‘).click(function () { callback(true); });
                    }
                },
                hide: function (callback) {
                    if (callback && callback instanceof Function) {
                        modal.on(‘hide.bs.modal‘, function (e) {
                            callback(e);
                        });
                    }
                }
            };
        };

        var _confirm = function (options) {
            var id = _dialog(options);
            var modal = $(‘#‘ + id);
            modal.find(‘.ok‘).removeClass(‘btn-primary‘).addClass(‘btn-success‘);
            modal.find(‘.cancel‘).show();

            return {
                id: id,
                on: function (callback) {
                    if (callback && callback instanceof Function) {
                        modal.find(‘.ok‘).click(function () { callback(true); });
                        modal.find(‘.cancel‘).click(function () { callback(false); });
                    }
                },
                hide: function (callback) {
                    if (callback && callback instanceof Function) {
                        modal.on(‘hide.bs.modal‘, function (e) {
                            callback(e);
                        });
                    }
                }
            };
        };

        var _load = function (options) {
            var ops = {
                url: ‘‘,
                title: ‘‘,
                width: 800,
                height: 550
            };
            $.extend(ops, options);
            var modalId = _getId();
            var html = _tplLoadHtml.replace(reg, function (node, key) {
                return {
                    Id: modalId,
                    Title: ops.title,
                    Url: ops.url,
                    Height: ops.height
                }[key];
            });

            $(‘body‘).append(html);
            var modal = $(‘#‘ + modalId).modal({
                width: ops.width
            });

            $(‘#‘ + modalId).on(‘hide.bs.modal‘, function (e) {
                $(this).parent(‘.modal-scrollable‘).next().remove();
                $(this).parent(‘.modal-scrollable‘).remove();
                $(‘body‘).modalmanager(‘toggleModalOpen‘);
            });
        }

        var _getId = function () {
            var date = new Date();
            return ‘mdl‘ + date.valueOf();
        }

        var _dialog = function (options) {
            var ops = {
                msg: "提示内容",
                title: "操作提示",
                btnok: "确定",
                btncl: "取消",
                width: 400,
                auto: false
            };

            $.extend(ops, options);

            var modalId = _getId();

            var html = _tplHtml.replace(reg, function (node, key) {
                return {
                    Id: modalId,
                    Title: ops.title,
                    Message: ops.msg,
                    BtnOk: ops.btnok,
                    BtnCancel: ops.btncl
                }[key];
            });

            $(‘body‘).append(html);
            $(‘#‘ + modalId).modal({
                width: ops.width,
                backdrop: ‘static‘
            });

            $(‘#‘ + modalId).on(‘hide.bs.modal‘, function (e) {
                //$(this).parent(‘.modal-scrollable‘).next().remove();
                //$(this).parent(‘.modal-scrollable‘).remove();
                $(‘body‘).modalmanager(‘toggleModalOpen‘);
            });

            return modalId;
        }

        var _cancelCheckbox = function () {
            //设置取消样式
            $(".datagrid-header-check .checker").find("span").attr("class", "");//取消头部第一个checkbox的样式
            $(".datagrid-cell-check .checker").find("span").attr("class", "");//取消列表选中checkbox的样式
            $(".datagrid-btable").find("tr").attr("class", "datagrid-row");//取消选中行的样式
            $(":checkbox:checked").attr("checked", false); //取消所有选中状态
        };

        return {
            alert: _alert,
            confirm: _confirm,
            load: _load,
            cancelcheck: _cancelCheckbox,
            loading: function () {
                $(‘body‘).modalmanager(‘loading‘);
            },
            removeLoading: function () {
                $(‘body‘).modalmanager(‘removeLoading‘);
            }
        }

    }();

});

3.0接下来看我们的案例代码

@{
    Layout = null;
}
//这里引入的文件要按照顺序
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/bootstrap/js/bootstrap.min.js"></script>
<script src="~/Scripts/bootstrap-modal/js/bootstrap-modal.js"></script>
<script src="~/Scripts/bootstrap-modal/js/bootstrap-modalmanager.js"></script>
<script src="~/Scripts/feng_modal.js"></script>
<link href="~/Scripts/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
<link href="~/Scripts/bootstrap-modal/css/bootstrap-modal.css" rel="stylesheet" />
<link href="~/Scripts/bootstrap-modal/css/bootstrap-modal-bs3patch.css" rel="stylesheet" />
<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div style="margin:500px" >
        <button type="button" class="btn btn-primary" onclick="testalert()">测试alert</button>
        <button type="button" class="btn btn-success" onclick="testload()">测试load</button>
        <button type="button" class="btn btn-warning" onclick="testconfirm()">测试confirm</button>
        <button type="button" class="btn btn-danger">测试</button>
    </div>
</body>
</html>

<script type="text/javascript">

    function testalert() {
        Modal.alert({msg:"测试"});
    }

    function testload() {
        Modal.load({ msg: "测试", url: "/Home/GetMsg/", title: "远程加载页面", width: 1100, height: 650 });
    }

    function testconfirm() {
        Modal.confirm({ msg: "确认要加载吗?" }).on(function (e) {
            if (e) {
                Modal.load({ msg: "测试", url: "/Home/GetMsg/", title: "远程加载页面", width: 1100, height: 650 });
            }
        });
    }

</script>

4.0看我们达到的效果

如果您看完本篇文章感觉不错,请点击左上角的【关注】来支持一下博主,谢谢!

如果您看完本篇文章感觉不错,请点击右下角的 【 推荐 】



作者:枫伶忆

QQ: 616931

出处:http://www.cnblogs.com/fenglingyi

声明:本文版权归作者和博客园共有,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利


时间: 2024-08-08 01:27:14

【原创】基于Bootstrap的Modal二次封装的相关文章

bootstrap模态框二次封装

方便工作需要,对于模态框二次封装,可拖动:15种动画效果,先看效果图; Demo请看留言第一条: <div class="panel panel-default"> <div class="panel-body"> <button class="btn btn-info" type="button">提示信息</button> <button class="btn

android基于开源网络框架asychhttpclient,二次封装为通用网络请求组件

网络请求是全部App都不可缺少的功能,假设每次开发都重写一次网络请求或者将曾经的代码拷贝到新的App中,不是非常合理,出于此目的,我希望将整个网络请求框架独立出来,与业务逻辑分隔开,这样就能够避免每次都要又一次编写网络请求,于是基于我比較熟悉的asynchttpclient又一次二次封装了一个网络请求框架. 思路:网络请求层唯一的功能就是发送请求,接收响应数据,请求取消,cookie处理这几个功能,二次助封装后这些功能能够直接调用封装好的方法就可以. 二次助封装代码例如以下: 1.功能接口: /

基于Senparc的二次封装

前段时间用Senparc做微信开发,但是个人感觉不太好用,所以我把Senparc的API用装饰器模式进行二次封装. 微信开发者平台文档地址:https://mp.weixin.qq.com/wiki 0x00 先上一个抽象类,对各种类型消息的抽象封装 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Se

Vue.js 自定义组件封装实录——基于现有控件的二次封装(以计时器为例)

在本人着手开发一个考试系统的过程中,出现了如下一个需求:制作一个倒计时的控件显示在试卷页面上.本文所记录的就是这样的一个过程. 前期工作 对于这个需求,自然我想到的是有没有现成的组件可以直接使用(本着不重复发明轮子的原则).于是我就在 GitHub 上找寻.确实找到了不少,但是与需求之间的差距还比较大.从零开始写又不太现实(时间摆在那里,加之自己的前端也是刚学,还没有从零开始手撸一个控件的能力),所以在已有组件的基础上进行二次封装便成了一个比较可行的方法(几乎也是唯一解).遂在 npm 上以 c

JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果

Ace模板地址:http://code.google.com/p/ace-engine/wiki/AceTemplate(有时会打不开) Ace英文官网:http://wrapbootstrap.com/preview/WB0B30DGR Ace模板功能介绍地址:http://www.cnblogs.com/txw1958/p/Ace-Responsive-Admin-Template.html 一.效果展示 1.初始加载出来的效果 2.展开菜单(支持多级展开,后面代码介绍) 3.点击子菜单,以

JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果分享(你值得拥有)

前言:最近园子里多了许多谈语言.谈环境.谈逼格(格局)的文章,看看笑笑过后,殊不知其实都是然并卵.提升自己的技术才是王道.之前博主分享过多篇bootstrap组件的文章,引起了很多园友的关注和支持,看样子这种风格还是受到很多园友青睐的.本着不辜负园友们的支持的原则,应群友们的要求,今天来分享下项目中使用Ace模板的菜单样式和基于iframe的Tab页效果. Ace模板地址:http://code.google.com/p/ace-engine/wiki/AceTemplate(有时会打不开) A

C#开发微信门户及应用(46)-基于Bootstrap的微信门户应用管理系统功能介绍

在前面介绍很多的微信框架,基本上都采用EasyUI的界面来搭建的微信框架,如随笔<C#开发微信门户及应用(8)-微信门户应用管理系统功能介绍>介绍的一样,不过随着微信的H5应用越来越多,因此转换为更适合做H5页面应用框架的Bootstrap开发框架,本文介绍的整个微信模块都是基于Bootstrap的应用. 微信开发包括公众号.企业号.微信小程序等方面的开发内容,需要对腾信的微信API接口进行封装:包括事件.菜单.订阅用户.多媒体文件.图文消息.消息群发.微信支付和企业红包.摇一摇设备.语义理解

BootStrap入门教程 (二)

上讲回顾:Bootstrap的手脚架(Scaffolding)提供了固定(fixed)和流式(fluid)两种布局,它同时建立了一个宽达940px和12列的格网系统. 基于手脚架(Scaffolding)之上,Bootstrap的基础CSS(Base CSS)提供了一系列的基础Html页面要素,旨在为用户提供新鲜.一致的页面外观和感觉.本文将主要深入讲解排版(Typography),表格(Table),表单(Forms),按钮(Buttons)这四个方面的内容. 排版 (Typography),

JS组件系列——基于Bootstrap Ace模板的菜单Tab页效果优化

前言:之前发表过一篇  JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果分享(你值得拥有) ,收到很多园友的反馈,当然也包括很多诟病,因为上篇只是将功能实现了,很多细节都没有处理,这篇博主将带领大家一起来优化这里的效果,使之成为一个可以在项目里面使用的成品. 说点题外话,本来,在互联网模式下,Tab页+iframe的组合是不能被大多数平台接受的,从这些年推出的一些好的产品可以看出,几乎大家都不这么玩,即使是一些后台的管理模板,比如常见的AdminLTE.Ace.INSPIN