JS组件系列——Bootstrap Table 表格行拖拽

原文:JS组件系列——Bootstrap Table 表格行拖拽

前言:之前一直在研究DDD相关知识,好久没更新JS系列文章了。这两天做了一个简单的业务需求,觉得效果还可以,今天在这里分享给大家,欢迎拍砖~~

一、业务需求及实现效果

项目涉及到订单模块,那天突然接到一个需求,说是两种不同状态的订单之间要实现插单的效果,页面上呈现方式是:左右两个Table,左边Table里面是状态为1的订单,右边Table里面是状态为2订单,左边Table里面的行数据拖动到右边Table里面指定行的位置,拖动完成后,左边表格减少一行,右边表格增加一行。除此之外,还需要撤销操作(相当于Ctrl + Z操作),能够返回到上一步的状态。可能描述会让大家模拟两可,反正已经实现了,先来看看效果图吧。

1、先看看拖动之前的效果

2、这是拖动左边表格行数据的效果

3、拖动一行完成之后表格数据的效果

4、第二次、第三次拖动完成后效果

5、右边表格上面撤销操作点击效果

6、多次点击撤销,表格回到初始状态

二、代码示例

初初接到需求,博主的第一感觉是应该上Bootstrap table api里面找一下,毕竟开源的力量是强大的,或许有相关的示例呢。经过一番查找,很可惜,Bootstrap Table没有这种两张表格之间的操作。想想其实也可以理解,Bootstrap Table是针对某个动态表格数据绑定的,它的侧重点是表格内部的功能,比如表格内部行的拖拽排序(Reorder Rows)有很好的解决方案,对于像博主这样的特殊需求,似乎也应该自己去实现。

1、需求分析

既然决定自己去写,博主开始分析需求,似乎这个操作里面比较困难的是拖拽效果,说到拖拽效果,原来使用JsPlumb的时候那使用太多了,于是就想到了我们神奇的JQuery UI里面的draggable.js 和droppable.js。拖拽的问题解决了,那么还有一个难点,就是撤销操作怎么办?我们知道Ctrl+z的意思是还原,什么叫还原?就是返回到上一步的操作,那么前提是要能够保存上一步的状态,说到保存某一步的状态,博主就知道怎么做了,需要一个全局变量Json,里面要有三个键值对,分别是当前步骤的索引、左边表格的数据、右边表格的数据。似乎也不太难嘛,博主就此着手,开干。

2、代码示例

2.1 cshtml页面代码

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
    @Styles.Render("~/Content/css")
    @Styles.Render("~/Content/table-css")
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/knockout")
    @Scripts.Render("~/bundles/bootstrap")
    @Scripts.Render("~/bundles/bootstrap-table")
    @RenderSection("Scripts", false)
</head>
<body>
    @RenderBody()
</body>
</html>

母版_layout.cshtml

@{
    ViewBag.Title = "订单插单";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@Scripts.Render("~/bundles/Order/InsertOrder")
@Styles.Render("~/bundles/Order/css")
@Scripts.Render("~/Content/bootstrap/datepicker/js")
@Styles.Render("~/Content/bootstrap/datepicker/css")

<script src="~/Content/jquery-ui-1.11.4.custom/jquery-ui.min.js"></script>

<div class="panel-body" style="padding-bottom:0px;">

        <div class="panel panel-default" style="margin-bottom:0px;">
            <div class="panel-heading">查询条件</div>
            <div class="panel-body container-fluid">
                <div class="row">
                    <div class="col-md-3">
                        <label for="txt_search_ordernumber" class="col-sm-4 control-label" style="margin-top:6px;">订单号</label>
                        <span class="col-sm-8">
                            <input type="text" class="form-control" id="txt_search_ordernumber">
                        </span>
                    </div>
                    <div class="col-md-3">
                        <label for="txt_search_bodynumber" class="col-sm-3 control-label" style="margin-top:6px;">车身号</label>
                        <span class="col-sm-8">
                            <input type="text" class="form-control" id="txt_search_bodynumber">
                        </span>
                    </div>
                    <div class="col-md-3">
                        <label for="txt_search_vinnumber" class="col-sm-4 control-label" style="margin-top:6px;">VIN码</label>
                        <span class="col-sm-8">
                            <input type="text" class="form-control" id="txt_search_vinnumber">
                        </span>
                    </div>
                    <div class="col-md-3">
                        <label for="txt_search_engin_code" class="col-sm-4 control-label" style="margin-top:6px;">发动机号</label>
                        <span class="col-sm-8">
                            <input type="text" class="form-control" id="txt_search_engin_code">
                        </span>
                    </div>
                </div>
                <div class="collapse" id="div_more_search">
                    <div class="row" style="margin-top:15px;">
                        <div class="col-md-3">
                            <label for="txt_search_import_startdate" class="col-sm-4 control-label" style="margin-top:6px;">导入时间</label>
                            <span class="col-sm-8">
                                <input type="text" class="form-control datetimepicker" readonly id="txt_search_import_startdate">
                            </span>
                        </div>
                        <div class="col-md-3">
                            <label for="txt_search_import_enddate" class="col-sm-3 control-label" style="margin-top:6px;">至</label>
                            <span class="col-sm-8">
                                <input type="text" class="form-control datetimepicker" readonly id="txt_search_import_enddate">
                            </span>
                        </div>
                        <div class="col-md-3">
                            <label for="txt_search_send_startdate" class="col-sm-4 control-label" style="margin-top:6px;">下发时间</label>
                            <span class="col-sm-8">
                                <input type="text" class="form-control datetimepicker" readonly id="txt_search_send_startdate">
                            </span>
                        </div>
                        <div class="col-md-3">
                            <label for="txt_search_send_enddate" class="col-sm-4 control-label" style="margin-top:6px;">至</label>
                            <span class="col-sm-8">
                                <input type="text" class="form-control datetimepicker" readonly id="txt_search_send_enddate">
                            </span>
                        </div>
                    </div>

                    <div class="row" style="margin-top:15px;">
                        <div class="col-md-3">
                            <label for="txt_search_carcode" class="col-sm-4 control-label" style="margin-top:6px;">整车编码</label>
                            <span class="col-sm-8">
                                <input type="text" class="form-control" id="txt_search_carcode">
                            </span>
                        </div>
                        <div class="col-md-3">
                            <label for="txt_search_vms" class="col-sm-3 control-label" style="margin-top:6px;">VMS号</label>
                            <span class="col-sm-8">
                                <input type="text" class="form-control" id="txt_search_vms">
                            </span>
                        </div>
                        <div class="col-md-3">
                            <label for="txt_search_trans_code" class="col-sm-4 control-label" style="margin-top:6px;">变速箱号</label>
                            <span class="col-sm-8">
                                <input type="text" class="form-control" id="txt_search_trans_code">
                            </span>
                        </div>
                    </div>
                </div>

                    <div class="row" style="float:right;margin-right:50px;margin-top:13px;">
                        <div>
                            <button type="button" id="btn_query" class="btn btn-primary" style="margin-right:20px;width:100px;">查询</button>
                            <button type="submit" id="btn_reset" class="btn btn-default" style="margin-right:20px;width:100px;">重置</button>
                        </div>

                    </div>
                </div>
        </div>

    <div class="collapse_div_outside">
        <div class="collapse_div_inside"></div>
        <span id="span_collapse" href="#div_more_search" class="collapse_div_inside_ele">展开<label class="glyphicon glyphicon-menu-down"></label></span>
    </div>
</div>

@*<div id="toolbar_left" class="btn-group">
</div>*@
<div id="toolbar_right" class="btn-group">
    <button id="btn_cancel" type="button" class="btn btn-default">
        <span class="glyphicon glyphicon-backward aria-hidden="true"></span>撤销
    </button>
    <button id="btn_insertorder" type="button" class="btn btn-default">
        <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>插单
    </button>
</div>
<div class="panel-body" style="padding-top:0px;">
    <div id="div_tableleft" class="col-md-6">
        <table id="tb_order_left"></table>
    </div>
    <div id="div_tableright" class="col-md-6">
        <table id="tb_order_right"></table>
    </div>
</div>

订单插单页面.cshtml

2.2 js代码

var i_statuindex = 0;
//此数组用于保存撤销操作每一步的数据
var arrdata = [];

var m_oTable = null;

$(function () {
    //1.初始化表格
    m_oTable = new TableInit();
    m_oTable.Init();

    //2.初始化按钮事件
    var oButtonInit = new ButtonInit();
    oButtonInit.Init();

    //3.日期控件的初始化
    $(".datetimepicker").datetimepicker({
        format: ‘yyyy-mm-dd hh:ii‘,
        autoclose: true,
        todayBtn: true,
    });

});

//表格相关事件和方法
var TableInit = function () {
    var oTableInit = new Object();

    oTableInit.Init = function () {
     //初始化左边表格
        $(‘#tb_order_left‘).bootstrapTable({
            url: ‘/api/OrderApi/get‘,
            method: ‘get‘,
            striped: true,
            cache: false,
            striped: true,
            pagination: true,
            height: 600,
            uniqueId:"TO_ORDER_ID",
            queryParams: oTableInit.queryParams,
            queryParamsType: "limit",
            sidePagination: "server",
            pageSize: 10,
            pageList: [10, 25, 50, 100],
            search: true,
            strictSearch: true,
            showColumns: true,
            showRefresh: true,
            minimumCountColumns: 2,
            clickToSelect: true,
            columns: [{
                checkbox: true
            },
            {
                field: ‘ORDER_NO‘,
                title: ‘订单号‘
            },
            {
                field: ‘BODY_NO‘,
                title: ‘车身号‘
            }, {
                field: ‘VIN‘,
                title: ‘VIN码‘
            }, {
                field: ‘TM_MODEL_MATERIAL_ID‘,
                title: ‘整车编码‘
            },
            {
                field: ‘ORDER_TYPE‘,
                title: ‘订单类型‘
            },
            {
                field: ‘ORDER_STATUS‘,
                title: ‘订单状态‘
            },
            {
                field: ‘CREATE_DATE‘,
                title: ‘订单导入时间‘
            },
            {
                field: ‘PLAN_DATE‘,
                title: ‘订单计划上线日期‘
            },
            {
                field: ‘VMS_NO‘,
                title: ‘VMS号‘
            },
            {
                field: ‘ENGIN_CODE‘,
                title: ‘发动机号‘
            },
            {
                field: ‘TRANS_CODE‘,
                title: ‘变速箱号‘
            },
            {
                field: ‘OFFLINE_DATE_ACT‘,
                title: ‘实际下线日期‘
            },
            {
                field: ‘HOLD_RES‘,
                title: ‘hold理由‘
            },
            {
                field: ‘SPC_FLAG‘,
                title: ‘特殊标记‘
            },
            ],
            onLoadSuccess: function (data) {
                 //表格加载完成之后初始化拖拽
          oTableInit.InitDrag();
            }
        });
     //初始化右边表格
        $(‘#tb_order_right‘).bootstrapTable({
            url: ‘/api/OrderApi/get‘,
            method: ‘get‘,
            toolbar: ‘#toolbar_right‘,
            striped: true,
            cache: false,
            striped: true,
            pagination: true,
            height: 600,
            queryParams: oTableInit.queryParamsRight,
            queryParamsType: "limit",
            //ajaxOptions: { departmentname: "", statu: "" },
            sidePagination: "server",
            pageSize: 10,
            pageList: [10, 25, 50, 100],
            search: true,
            strictSearch: true,
            showRefresh: true,
            minimumCountColumns: 2,
            columns: [
            {
                field: ‘ORDER_NO‘,
                title: ‘订单号‘
            },
            {
                field: ‘BODY_NO‘,
                title: ‘车身号‘
            }, {
                field: ‘VIN‘,
                title: ‘VIN码‘
            }, {
                field: ‘TM_MODEL_MATERIAL_ID‘,
                title: ‘整车编码‘
            },
            {
                field: ‘ORDER_TYPE‘,
                title: ‘订单类型‘
            },
            {
                field: ‘ORDER_STATUS‘,
                title: ‘订单状态‘
            },
            {
                field: ‘CREATE_DATE‘,
                title: ‘订单导入时间‘
            },
            {
                field: ‘PLAN_DATE‘,
                title: ‘订单计划上线日期‘
            },
            {
                field: ‘VMS_NO‘,
                title: ‘VMS号‘
            },
            {
                field: ‘ENGIN_CODE‘,
                title: ‘发动机号‘
            },
            {
                field: ‘TRANS_CODE‘,
                title: ‘变速箱号‘
            },
            {
                field: ‘OFFLINE_DATE_ACT‘,
                title: ‘实际下线日期‘
            },
            {
                field: ‘HOLD_RES‘,
                title: ‘hold理由‘
            },
            {
                field: ‘SPC_FLAG‘,
                title: ‘特殊标记‘
            },
            ],
            onLoadSuccess: function (data) {
                oTableInit.InitDrop();
            }
        });
    };
    //注册表格行的draggable事件
    oTableInit.InitDrag = function () {
        $(‘#tb_order_left tr‘).draggable({
            helper: "clone",
            start: function (event, ui) {
                var old_left_data = JSON.stringify($(‘#tb_order_left‘).bootstrapTable("getData"));
                var old_right_data = JSON.stringify($(‘#tb_order_right‘).bootstrapTable("getData"));
                var odata = { index: ++i_statuindex, left_data: old_left_data, right_data: old_right_data };
                arrdata.push(odata);
            },
            stop: function (event, ui) {

            }
        });
    };
    //注册右边表格的droppable事件
    oTableInit.InitDrop = function () {
        $("#tb_order_right").droppable({
            drop: function (event, ui) {
                var arrtd = $(ui.helper[0]).find("td");
                var rowdata = {
                    ORDER_NO: $(arrtd[1]).text(),
                    BODY_NO: $(arrtd[2]).text(),
                    VIN: $(arrtd[3]).text(),
                    TM_MODEL_MATERIAL_ID: $(arrtd[4]).text(),
                    ORDER_TYPE: $(arrtd[5]).text(),
                    ORDER_STATUS: $(arrtd[6]).text(),
                    CREATE_DATE: $(arrtd[7]).text() == "-" ? null : $(arrtd[7]).text(),
                    PLAN_DATE: $(arrtd[8]).text() == "-" ? null : $(arrtd[8]).text(),
                    VMS_NO: $(arrtd[9]).text(),
                    ENGIN_CODE: $(arrtd[10]).text(),
                    TRANS_CODE: $(arrtd[11]).text(),
                    OFFLINE_DATE_ACT: $(arrtd[12]).text() == "-" ? null : $(arrtd[12]).text(),
                    HOLD_RES: $(arrtd[13]).text(),
                    SPC_FLAG: $(arrtd[14]).text(),
                    TO_ORDER_ID: $(ui.helper[0]).attr("data-uniqueid")

                };
                var oTop = ui.helper[0].offsetTop;
                var iRowHeadHeight = 40;
                var iRowHeight = 37;
                var rowIndex = 0;
                if (oTop <= iRowHeadHeight + iRowHeight / 2) {
                    rowIndex = 0;
                }
                else {
                    rowIndex = Math.ceil((oTop - iRowHeadHeight) / iRowHeight);
                }
          //插入右边表格指定位置行数据
                $("#tb_order_right").bootstrapTable("insertRow", { index: rowIndex, row: rowdata });
                $(‘#tb_order_left‘).bootstrapTable("removeByUniqueId", $(ui.helper[0]).attr("data-uniqueid"));
                oTableInit.InitDrag();
            }
        });
    };

    oTableInit.queryParams = function (params) {  //配置参数
        var temp = {   //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
            limit: params.limit,   //页面大小
            offset: params.offset,  //页码
            strBodyno: $("#txt_search_bodynumber").val(),
            strVin: $("#txt_search_vinnumber").val(),
            strOrderno: $("#txt_search_ordernumber").val(),
            strEngincode: $("#txt_search_engin_code").val(),
            strOrderstatus: 0,
            strTranscode: $("#txt_search_trans_code").val(),
            strVms: $("#txt_search_vms").val(),
            strCarcode: $("#txt_search_carcode").val(),
            strImportStartdate: $("#txt_search_import_startdate").val(),
            strImportEnddate: $("#txt_search_import_enddate").val(),
            strSendStartdate: $("#txt_search_send_startdate").val(),
            strSendEnddate: $("#txt_search_send_enddate").val(),

        };
        return temp;
    };

    oTableInit.queryParamsRight = function (params) {  //配置参数
        var temp = {   //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
            limit: params.limit,   //页面大小
            offset: params.offset,  //页码
            strBodyno: "",
            strVin: "",
            strOrderno: "",
            strEngincode: "",
            strOrderstatus: 5,
            strTranscode: "",
            strVms: "",
            strCarcode: "",
            strImportStartdate: "",
            strImportEnddate: "",
            strSendStartdate: "",
            strSendEnddate: "",

        };
        return temp;
    };

    return oTableInit;
};

//页面按钮初始化事件
var ButtonInit = function () {
    var oInit = new Object();
    var postdata = {};

    oInit.Init = function () {

        //查询点击事件
        $("#btn_query").click(function () {
            $("#tb_order_left").bootstrapTable(‘refresh‘);
        });

        //重置点击事件
        $("#btn_reset").click(function () {
            $(".container-fluid").find(".form-control").val("");
            $("#tb_order_left").bootstrapTable(‘refresh‘);
        });
        //撤销操作点击事件
        $("#btn_cancel").click(function () {
            if (i_statuindex <= 0) {
                return;
            }
            for (var i = 0; i < arrdata.length; i++) {
                if (arrdata[i].index != i_statuindex) {
                    continue;
                }
                var arr_left_data = eval(arrdata[i].left_data);
                var arr_right_data = eval(arrdata[i].right_data);

                $(‘#tb_order_left‘).bootstrapTable(‘removeAll‘);
                $(‘#tb_order_right‘).bootstrapTable(‘removeAll‘);
                $(‘#tb_order_left‘).bootstrapTable(‘append‘, arr_left_data);
                for (var x = 0; x < arr_right_data.length; x++) {
                    $("#tb_order_right").bootstrapTable("insertRow", { index: x, row: arr_right_data[x] });
                }

                //$(‘#tb_order_right‘).bootstrapTable(‘append‘, arr_right_data);//append之后不能drop
                break;
            }
            i_statuindex--;

            //重新注册可拖拽
            m_oTable.InitDrag();
            //m_oTable.InitDrop();
        });

        //搜索栏展开收起点击事件
        $("#span_collapse").click(function () {
            if ($(this).text() == "收起") {
                $(this).html(‘展开<label class="glyphicon glyphicon-menu-down"></label>‘);
                $("#div_more_search").collapse(‘hide‘);
            }
            else {
                $(this).html(‘收起<label class="glyphicon glyphicon-menu-up"></label>‘);
                $("#div_more_search").collapse(‘show‘)
            }
        });
    };

    return oInit;
};

全部JS代码

我们重点来看几个地方的代码:

2.2.1  左边表格加载成功之后执行表格行的可拖拽。

$(‘#tb_order_left tr‘).draggable({
            helper: "clone",
            start: function (event, ui) {
                var old_left_data = JSON.stringify($(‘#tb_order_left‘).bootstrapTable("getData"));
                var old_right_data = JSON.stringify($(‘#tb_order_right‘).bootstrapTable("getData"));
                var odata = { index: ++i_statuindex, left_data: old_left_data, right_data: old_right_data };
                arrdata.push(odata);
            },
            stop: function (event, ui) {
            }
        });

在draggable的start事件中,我们将拖拽之前的左右表格中的数据全部保存到arrdata变量中,i_statuindex这个全局变量用于记录当前这一步的索引,用于撤销操作。

2.2.2 右边表格在加载成功之后注册表格的droppable事件

    $("#tb_order_right").droppable({
            drop: function (event, ui) {
                var arrtd = $(ui.helper[0]).find("td");
                var rowdata = {
                    ORDER_NO: $(arrtd[1]).text(),
                    BODY_NO: $(arrtd[2]).text(),
                    VIN: $(arrtd[3]).text(),
                    TM_MODEL_MATERIAL_ID: $(arrtd[4]).text(),
                    ORDER_TYPE: $(arrtd[5]).text(),
                    ORDER_STATUS: $(arrtd[6]).text(),
                    CREATE_DATE: $(arrtd[7]).text() == "-" ? null : $(arrtd[7]).text(),
                    PLAN_DATE: $(arrtd[8]).text() == "-" ? null : $(arrtd[8]).text(),
                    VMS_NO: $(arrtd[9]).text(),
                    ENGIN_CODE: $(arrtd[10]).text(),
                    TRANS_CODE: $(arrtd[11]).text(),
                    OFFLINE_DATE_ACT: $(arrtd[12]).text() == "-" ? null : $(arrtd[12]).text(),
                    HOLD_RES: $(arrtd[13]).text(),
                    SPC_FLAG: $(arrtd[14]).text(),
                    TO_ORDER_ID: $(ui.helper[0]).attr("data-uniqueid")

                };
                var oTop = ui.helper[0].offsetTop;
                var iRowHeadHeight = 40;
                var iRowHeight = 37;
                var rowIndex = 0;
                if (oTop <= iRowHeadHeight + iRowHeight / 2) {
                    rowIndex = 0;
                }
                else {
                    rowIndex = Math.ceil((oTop - iRowHeadHeight) / iRowHeight);
                }
                $("#tb_order_right").bootstrapTable("insertRow", { index: rowIndex, row: rowdata });
                $(‘#tb_order_left‘).bootstrapTable("removeByUniqueId", $(ui.helper[0]).attr("data-uniqueid"));
                oTableInit.InitDrag();
            }
        });

在drop事件时,取到当前拖过来的行数据,计算当前鼠标所在的位置,在右边表格指定位置插入拖过来的行数据。然后删除左边表格拖过来的行数据。

2.2.3 撤销操作代码

     //撤销操作点击事件
        $("#btn_cancel").click(function () {
            if (i_statuindex <= 0) {
                return;
            }
            for (var i = 0; i < arrdata.length; i++) {
                if (arrdata[i].index != i_statuindex) {
                    continue;
                }
                var arr_left_data = eval(arrdata[i].left_data);
                var arr_right_data = eval(arrdata[i].right_data);

                $(‘#tb_order_left‘).bootstrapTable(‘removeAll‘);
                $(‘#tb_order_right‘).bootstrapTable(‘removeAll‘);
                $(‘#tb_order_left‘).bootstrapTable(‘append‘, arr_left_data);
                for (var x = 0; x < arr_right_data.length; x++) {
                    $("#tb_order_right").bootstrapTable("insertRow", { index: x, row: arr_right_data[x] });
                }
                //$(‘#tb_order_right‘).bootstrapTable(‘append‘, arr_right_data);//append之后不能drop
                break;
            }
            i_statuindex--;

            //重写注册可拖拽
            m_oTable.InitDrag();
        });

撤销操作主要是通过全局变量arrdata里面的索引判断撤销到哪一步,然后根据索引取出当前步骤的左右表格数据,依次向两表格插入数据,然后i_statuindex依次递减,直至等于零,由于左边表格行数据全部重写加载过,所以需要重新注册可拖拽事件。就是这么简单的三步就能实现想要的效果,是不是很简单~~

时间: 2024-10-13 23:44:24

JS组件系列——Bootstrap Table 表格行拖拽的相关文章

JS组件系列——Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案

前言:最近项目里面需要用到表格的冻结列功能,所谓“冻结列”,就是某些情况下表格的列比较多,需要固定前面的几列,后面的列滚动.遗憾的是,bootstrap table里自带的fixed column功能有一点bug,于是和同事讨论该如何解决,于是就有了这篇文章. 一.起因回顾 最近项目里面有一个表格需求,该表格列是动态产生的,而且列的数量操作一定值以后就会出现横向滚动条,滚动的时候需要前面几列固定.也就是所谓的excel的冻结列功能.该如何实现呢?不用多说,当然是查文档,于是找到了这篇http:/

JS组件系列——Bootstrap文件上传组件:bootstrap fileinput

原文:JS组件系列--Bootstrap文件上传组件:bootstrap fileinput 前言:之前的三篇介绍了下bootstrap table的一些常见用法,发现博主对这种扁平化的风格有点着迷了.前两天做一个excel导入的功能,前端使用原始的input type='file'这种标签,效果不忍直视,于是博主下定决心要找一个好看的上传组件换掉它.既然bootstrap开源,那么社区肯定有很多关于它的组件,肯定也有这种常见的上传组件吧.经过一番查找,功夫不负有心人,还是被博主找到了这个组件:

JS组件系列——Bootstrap寒冬暖身篇:弹出框和提示框效果以及代码展示

原文:JS组件系列--Bootstrap寒冬暖身篇:弹出框和提示框效果以及代码展示 前言:对于Web开发人员,弹出框和提示框的使用肯定不会陌生,比如常见的表格新增和编辑功能,一般常见的主要有两种处理方式:行内编辑和弹出框编辑.在增加用户体验方面,弹出框和提示框起着重要的作用,如果你的系统有一个友好的弹出提示框,自然能给用户很好的页面体验.前面几章介绍了bootstrap的几个常用组件,这章来看看bootstrap里面弹出框和提示框的处理.总的来说,弹出提示主要分为三种:弹出框.确定取消提示框.信

【转】JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐(二)

前言:上篇 JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐 分享了几个项目中比较常用的组件,引起了许多园友的关注.这篇还是继续,因为博主觉得还有几个非常简单.实用的组件,实在不愿自己一人独享,没办法,谁让博主这么爱分享呢~~ 本文原创地址:http://www.cnblogs.com/landeanfen/p/5603790.html 七.多值输入组件manifest 关于文本框的多值输入,一直是一个比较常见的需求,今天博主推荐一款好用的多值输入组件给大家,不要谢我,请叫我“红

JS组件系列——Bootstrap Select2组件使用小结

前言:在介绍select组件的时候,博主之前分享过一篇JS组件系列——两种bootstrap multiselect组件大比拼,这两个组件的功能确实很强大,只可惜没有图文结合的效果(也就是将图片放入到select里面随着文字一起显示).前两天做一个菜单图标选择的功能,就要用到这个图文选择的功能.于是乎又是找啊找.终于不负所望,找到了我们伟大的select2组件.今天分享下这个组件的一些用法和特性. 一.组件说明以及API说明 Select2使用示例地址:https://select2.githu

JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐

前言:之前分享过很多bootstrap常用组件,包括表格.表单验证.文件上传.复选下拉框.弹出框等.这段时间,博主又收藏了一些好用的组件(有些在项目中已经用起来了),经过两天的时间,已经整理出了一部分,本着“好东西要与人分享”的原则,今天还是来点福利,将博主收藏的东西分享出来,供需要的园友参考.组件大部分都是些开源组件,也有部分是博主自己在网上找到然后改写出来的效果,可能不尽如人意,有兴趣的且看看吧. 一.时间组件 bootstrap风格的时间组件非常多,你可以在github上面随便搜索“dat

JS组件系列——Bootstrap右键菜单解决方案:ContextMenu

前言:有段时间没发表随笔了,过个年人都变得懒了.新年刚来上班,今天正好得空,将去年遗留的两个小组件总结记录下.有朋友跟我说:你的bootstrap组件要能够形成一个可以满足一般项目需求的系列组件,才有真正的实用价值.想想说得在理.这不今天来总结下bootstrap的一个小组件的应用.好了,不说废话,进入正题吧. 一.ContextMenu介绍 年前,博主接到一个需求:表格行调序,支持多选调序,并且可以不连续多选.什么意思呢?先来看看需要实现的效果图: 需求是:需要将选中的6.8.9行移动到第2行

JS组件系列——自己动手扩展BootstrapTable的 冻结列 功能:彻底解决高度问题

前言:一年前,博主分享过一篇关于bootstrapTable组件冻结列的解决方案  JS组件系列——Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案 ,通过该篇,确实可以实现bootstrapTable的冻结列效果,并且可以兼容ie浏览器.这一年的时间,不断有园友以及群里面的朋友问过我关于固定高度之后,冻结列页面效果不能对齐的问题,奈何博主太忙,一直没有抽空将这个问题优化.最近项目里面也不断有人提过这个bug,这下子不能再推了,必须要直面“惨淡的bug”,于是昨天利用一天的

JS组件系列——分享自己封装的Bootstrap树形组件:jqTree

前言:之前的一篇介绍了下如何封装自己的组件,这篇再次来体验下自己封装组件的乐趣.看过博主博客的园友应该记得之前分享过一篇树形菜单的使用JS组件系列——Bootstrap 树控件使用经验分享,这篇里面第一个Jquery Tree,只是用简单样式和js去实现了效果,没有给出一个系统的封装,这篇博主就来试试在此样式的基础上封装一个稍微完整点的树形组件. 一.组件效果预览 其实效果和之前的那个差不多,博主只是在之前的基础上加了一个选中的背景色. 全部收起 展开 全部展开 二.代码示例 其实效果很简单,重