Bootstrap Modal的“上一步”,“下一步”切换功能的实现

1.功能分析

  当我们注册用户信息的时候,系统会弹出一个模态框。如果需要填写的表单信息比较多,就会按照模块分步骤显示。当第一个模块填写完毕后,我们点击下一步,则下一个模块会覆盖当前模块,直到最后提交。同时,我们也可以返回上一步,重新填写。
  笔者针对代码的重用性和拓展性,实现了一个Bootstrap Modal分步填写表单的小插件,同时兼顾首页,尾页,中间页,单页等情况下的模块切换方式,代码尽力简化到最优。

2. Html示例代码

  有关Bootstrap Modal的基本介绍可以参考Bootstrap 模态框(Modal)插件。本样例Html代码如下。

<!-- 按钮触发模态框 -->
<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
    弹出模态框
</button>

<!-- 模态框(Modal) -->
<div id="myModal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="modalTitle" 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="modalTitle">
                    模态框标题
                </h4>
            </div>
            <div class="modal-body">
                <div><input></div>
                <div><input></div>
            </div>
            <div class="modal-footer">
                <button type='button' class='btn btn-primary previous-page hidden'>
                    上一页
                </button>
                <button type="button" class="btn btn-primary next-page">
                    下一页
                </button>
                <button type="button" class="btn btn-default" data-dismiss="modal">
                    取消
                </button>
                <label class="page-index" hidden>0</label>
            </div>
        </div><!-- /.modal-content -->
    </div><!-- /.modal -->
</div>

其中,类名为“page-index”的lable为隐藏标签,表示当前表单模块所在的页码,初始值为0。

3.javascript代码实现

  首先,定义了一个命为controlPageToggle的核心函数,用于控制步骤切换。

/**
 *
 * @param modalSelect modal选择符,本例为“#myModal”
 * @param modalDataArray html代码字符串数组
 * @param currentPageIndex 当前页码
 * @param direction 1表示下一页方向,-1表示上一页方向
 */
function controlPageToggle(modalSelect, modalDataArray, currentPageIndex, direction) {
    var arrayLength = modalDataArray.length;
    if (arrayLength <= 1)
        return;

    if (direction == 1) {
        //如果当前页是倒数第二页,则将下一页设置为尾页
        if (currentPageIndex == arrayLength - 2) {
            $(modalSelect + " " + ".next-page").text("提交");
        }

        //如果当前页是首页,添加上一页
        if (currentPageIndex == 0 && arrayLength > 1) {
            $(modalSelect + " " + ".previous-page").removeClass("hidden");
        }
        //更换modal-body和页码
        $(modalSelect + " " + ".page-index").text((++currentPageIndex).toString());
        $(modalSelect + " " + ".modal-body").html(modalDataArray[currentPageIndex]);
    }
    else {
        //如果当前页是尾页
        if (currentPageIndex == arrayLength - 1) {
            $(modalSelect + " " + ".next-page").text("下一页");
        }

        //如果当前页是正数第二页,则将上一页设置为首页
        if (currentPageIndex == 1) {
            $(modalSelect + " " + ".previous-page").addClass("hidden");
        }
        //更换modal-body和页码
        $(modalSelect + " " + ".page-index").text((--currentPageIndex).toString());
        $(modalSelect + " " + ".modal-body").html(modalDataArray[currentPageIndex]);
    }

}

  接下来,定义moadlDataControl,将Modal模态框进行初始化操作,包括指定Modal选择符,填充表单元素,绑定步骤切换事件等。

/**
 *
 * @param modalSelect modal选择符
 * @param modalDataArray html代码字符串数组
 * @param modalCallback modal回调函数
 */
function moadlDataControl(modalSelect, modalDataArray, modalCallback) {
    //初始化模态框首页数据
    $(modalSelect + " " + ".modal-body").html(modalDataArray[0]);
    if (modalDataArray.length <= 1) {
        $(modalSelect + " " + ".next-page").text("提交");
    }

    //点击下一页
    $(modalSelect + " " + ".next-page").click(function () {
        //调用回调函数
        modalCallback();
        if ($(this).text() == "提交") {
            $(modalSelect).modal('hide');
            return;
        }
        //获取当前页码
        var currentPageIndex = parseInt($(modalSelect + " " + ".page-index").text());
        controlPageToggle(modalSelect, modalDataArray, currentPageIndex, 1);
    });

    //点击上一页
    $(modalSelect + " " + ".previous-page").click(function () {
        //获取当前页码
        var currentPageIndex = parseInt($(modalSelect + " " + ".page-index").text());
        controlPageToggle(modalSelect, modalDataArray, currentPageIndex, -1);
    });

    //关闭模态框时,重置为首页
    $(modalSelect).on('hidden.bs.modal', function () {
        $(modalSelect + " " + ".page-index").text((0).toString());
        if (modalDataArray.length <= 1) {
            $(modalSelect + " " + ".next-page").text("提交");
        }
        else {
            $(modalSelect + " " + ".next-page").text("下一页");
        }
        $(modalSelect + " " + ".modal-body").html(modalDataArray[0]);
        $(modalSelect + " " + ".previous-page").addClass("hidden");
    })
}

  最后,我们可以根据自己的需求来定义回调函数modalCallback。该函数在每次点击“下一页”或者“提交”按钮时触发。如我们可以实现模块数据前端验证或提交表单数据到后台等功能,本例只是弹出文本。

function modalCallback() {
    alert("调用回调函数");
}

  经过上述的封装,我们调用起来就非常方便了,示例如下。

$(function () {
    //定义模态框数据
    var modalDataArray = new Array("<div><button>首页</button></div>", "<div><select></select></div>", "<div><input></div>", "<label>尾页</label>");
    moadlDataControl("#myModal", modalDataArray, modalCallback);
});

  大家有什么不懂的请随时提问哦,需要源码的请把邮箱写一下,我传给你们,谢谢支持!!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 42
    评论
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值