实现jquery的grid插件

本文介绍了一个基于jQuery的表格插件,该插件支持分页、按钮及其事件绑定、表格绘制及自定义列等功能。插件允许通过配置项来定义是否启用多选、列宽、隐藏列等,并提供了丰富的事件处理和数据加载逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天刚写的例子,还热着呢,有分页,按钮及其事件,表格绘制回调用函数,自定义列(模板和可执行简单的表达式${xxxxx})

如下:

/**
 * Created by chenhao on 2016/3/31.
 */
(function ($) {
    $.fn.extend({
        "grid": function (options) {
            var opts = $.extend({}, defaluts, options);
            var timestamp = new Date().getTime();
            opts.gridId = "gridId" + timestamp;
            opts.paginationId = "pagination" + timestamp;
            opts.paginationDesId = "paginationDesId" + timestamp;
            opts.selectAllId = "selectAllId" + timestamp;
            opts.selectName = "selectName" + timestamp;
            var $this = $(this);
            var html = "";
            if (opts.buttons != null) {
                for (var i = 0; i < opts.buttons.length; i++) {
                    var btn_id = opts.buttons[i]["id"];
                    html += "<input type='button' id='" + btn_id + "' style='margin:0 5px;' class='btn btn-default' value='" 
                        + opts.buttons[i]["text"] + "'/>";
                    if (opts.buttons[i]["action"] != null)
                        $(document).on('click', '#' + btn_id, eval(opts.buttons[i]["action"]));
                }
            }
            html += "<table id='" + opts.gridId + "' class='table'><thead><tr>";
            if (opts.ennableSelect) {
                html += "<th width='50px'><input id='" + opts.selectAllId + "' type='checkbox'></th>";
            }
            for (var i = 0; i < opts.columns.length; i++) {
                if (opts.columns[i]["hidden"]) {
                    html += "<th style='display: none'>" + opts.columns[i]["display"] + "</th>";
                } else {
                    html += "<th>" + opts.columns[i]["display"] + "</th>";
                }
            }
            html += "</tr></thead><tbody></tbody></table>";
            html += "<span id='" + opts.paginationDesId + "' style='float: right'>第 1 / 1 页</span><nav><ul class='pagination' id='" 
                + opts.paginationId + "'>";
            html += "<li><a href='javascript:;' class='firstPage'>首页</a></li>";
            html += "<li><a href='javascript:;' class='prevPage'>向前</a></li>";
            html += "<li><a href='javascript:;' class='nextPage'>向后</a></li>";
            html += "<li><a href='javascript:;' class='lastPage'>末页</a></li>";
            html += "</ul></nav>";
            $this.html(html);
            loadData($this, opts);
            return {
                getGridId: function () {
                    return opts.gridId;
                },
                reload: function (params) {
                    opts.pagination.pageNo = 1;
                    if (params) {
                        opts.ajax.params = params;
                    }
                    loadData($this, opts);
                },
                getSelectedRows: function () {
                    var rows = [];
                    $("#" + opts.gridId + " input[name='" + opts.selectName + "']").each(function (index) {
                        if ($(this).is(':checked')) {
                            rows.push(opts.data[index]);
                        }
                    });
                    return rows;
                }
            };
        }
    });

    var defaluts = {
        ennableSelect: false,
        columns: [],
        data: [],
        pagination: {
            pageSizes: [10, 20, 30, 50, 100],
            pageSize: 10,
            pageNo: 1,
            count: 0
        },
        callback: function () {
            //console.log("操作成功");
        }
    };

    function initTool(obj, opts) {

        $("#" + opts.selectAllId).removeAttr("checked");

        $("#" + opts.paginationDesId).html("第 " + opts.pagination.pageNo + " / " 
        + Math.ceil(opts.pagination.count / opts.pagination.pageSize) + " 页");

        $("#" + opts.paginationId).find(".firstPage").parent().removeClass("disabled");
        $("#" + opts.paginationId).find(".prevPage").parent().removeClass("disabled");
        $("#" + opts.paginationId).find(".nextPage").parent().removeClass("disabled");
        $("#" + opts.paginationId).find(".lastPage").parent().removeClass("disabled");

        if (opts.pagination.pageNo == 1) {
            $("#" + opts.paginationId).find(".firstPage").parent().addClass("disabled");
            $("#" + opts.paginationId).find(".prevPage").parent().addClass("disabled");
        }

        if (opts.pagination.pageNo == Math.ceil(opts.pagination.count / opts.pagination.pageSize)) {
            $("#" + opts.paginationId).find(".nextPage").parent().addClass("disabled");
            $("#" + opts.paginationId).find(".lastPage").parent().addClass("disabled");
        }

        $("#" + opts.paginationId).find(".firstPage").unbind().click(function () {
            if (opts.pagination.pageNo != 1) {
                opts.pagination.pageNo = 1;
                loadData(obj, opts);
            }
        });
        $("#" + opts.paginationId).find(".prevPage").unbind().click(function () {
            if (opts.pagination.pageNo > 1) {
                opts.pagination.pageNo--;
                loadData(obj, opts);
            }
        });
        $("#" + opts.paginationId).find(".nextPage").unbind().click(function () {
            if (opts.pagination.pageNo < Math.ceil(opts.pagination.count / opts.pagination.pageSize)) {
                opts.pagination.pageNo++;
                loadData(obj, opts);
            }
        });
        $("#" + opts.paginationId).find(".lastPage").unbind().click(function () {
            if (opts.pagination.pageNo != Math.ceil(opts.pagination.count / opts.pagination.pageSize)) {
                opts.pagination.pageNo = Math.ceil(opts.pagination.count / opts.pagination.pageSize);
                loadData(obj, opts);
            }
        });
        $("#" + opts.selectAllId).unbind().click(function () {
            if ($(this).is(':checked')) {
                $("input[name='" + opts.selectName + "']").prop("checked", "checked");
            } else {
                $("input[name='" + opts.selectName + "']").removeAttr("checked");
            }
        });
        $("input[name='" + opts.selectName + "']").unbind().click(function () {
            var allSelected = true;
            $("input[name='" + opts.selectName + "']").each(function () {
                if (!$(this).is(':checked')) {
                    allSelected = false;
                }
            });
            if (allSelected) {
                $("#" + opts.selectAllId).prop("checked", "checked");
            } else {
                $("#" + opts.selectAllId).removeAttr("checked");
            }
        });
    }

    function loadData(obj, opts) {
        opts.ajax.params.pageSize = opts.pagination.pageSize;
        opts.ajax.params.pageNo = opts.pagination.pageNo;
        $.ajax({
            url: opts.ajax.url,
            type: "post",
            dataType: "json",
            contentType: "application/json",
            data: JSON.stringify(opts.ajax.params),
            success: function (result) {
                if (!result.data) return;
                opts.pagination.count = result.count;
                opts.data = result.data;
                var html = "";
                for (var i = 0; i < result.data.length && i < opts.pagination.pageSize; i++) {
                    html += "<tr>";
                    if (opts.ennableSelect) {
                        html += "<th><input name='" + opts.selectName + "' type='checkbox'></th>";
                    }
                    for (var j = 0; j < opts.columns.length; j++) {
                        if (opts.columns[j]["hidden"]) {
                            html += "<td style='display: none'>";
                        } else {
                            html += "<td>";
                        }
                        if (opts.columns[j]["template"]) {
                            var temp = opts.columns[j]["template"];
                            while (temp.indexOf("value") > -1) {
                                temp = temp.replace("value", "'" + result.data[i][opts.columns[j]["name"]] + "'");
                            }
                            while (temp.indexOf("${") > -1) {
                                temp = temp.replace(
                                        temp.substring(temp.indexOf("${"), temp.indexOf("}") + 1), 
                                        eval(temp.substring(temp.indexOf("${") + 2, temp.indexOf("}")))
                                      );
                            }
                            html += temp;
                        } else {
                            html += result.data[i][opts.columns[j]["name"]];
                        }
                        html += "</td>";
                    }
                    html += "</tr>";
                }
                html += "</tbody></table>";
                obj.find("tbody").html(html);
                initTool(obj, opts);
                eval(opts.callback());
            }
        });
    }

})(jQuery);


使用demo:

//初始化codeGrid
var codeGridApi = $("#codeTable").grid({
    ennableSelect: true,
    columns: [
        {name: "codeid", display: "codeid", hidden: true},
        {name: "code", "display": "代码"},
        {name: "description", "display": "描述"},
        {
            name: "codeid",
            display: "操作",
            template: "<button class='btn btn-primary' onclick='initDataBookValue(\"${value}\")'><span class='btn-span'>查看值</span></button>"
        }
    ],
    ajax: {
        url: window.serviceUrl + "bookCodeController/queryBookCode?token=" + (localStorage.getItem("token") || ""),
        params: {}
    },
    callback: function () {
        $("#valueTable").html("");
        $("#insertValue").unbind();
        $("#updateValue").unbind();
        $("#deleteValue").unbind();
    }
});


//获取选择的内容
var data = codeGridApi.getSelectedRows();

//根据参数重载,参数可为空
codeGridApi.reload(json参数);


转载于:https://my.oschina.net/chenhao901007/blog/654073

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值