美文网首页程序员
jq 封装table 组件

jq 封装table 组件

作者: Moon_cs | 来源:发表于2020-11-27 16:28 被阅读0次
    1. 在jq项目里面我们也会用到一下表格,这个时候就是用到表格
      先提条件就是已经用了,jq的插件了
      在components建立table组件命名 table.js
    // 设置全局
    window.$ = $;
    window.jQuery = $;
    window.getType = function (str) {
    
        var a = typeof (str);
        if (a === 'object') {
            var t = Object.prototype.toString.call(str);
            switch (t) {
                case "[object Function]":
                    return 'Function';
                case "[object Array]":
                    return 'Array';
                default:
                    return a;
            }
        } else if (a == 'function') {
            return 'Function';
        } else {
            return a;
        }
    };
    
    function Custom_table(){
    
        //表格事件
        this.events=null;
        /**
         * 列表table展示对象
         */
        this.table = null;
        /**
         * 列表table body展示对象
         */
        this.tableTbody = null;
        /**
         * 列表table page展示对象
         */
        this.tablePageDiv = null;
        
        /**
         * 列表table 数据集合(非外部传入)
         */
        this.pageData = null;
        
        /**
         * 列表table 列数
         */
        this.columnNum = 0;
        
        /**
         * 列表行排列集函数
         */
        this.renderRow = null;
        
        /**
         * 数据加载完成后执行的扩展方法(可选)
         */
        this.loadEndFun = null;
            
        /**
         * 每页记录下拉框(可选)
         */
        this.pageConfig = false;
        /**
         * 分页数据
         */
        this.options=null;
        this.pageOptions = {
            // 当前页号, 从1开始
            currentPage : 1,
            // 上一页 
            previousPage : 1,
            // 下一页
            nextPage : 1,
            // 总页数
            totlePage : 1,
            // 总记录数
            totleRows : 0,
            // 当前记录数开始序列,默认从0开始
            startNum : 0,
            // 单页显示最大数量
            pageSize : 10,
            //是否显示分页
            showPage:true,
            // 单页显示数量选择集合
            selectPageSize : [5,10,20,50]
        };
        return this;
    }
    /**
     * 初始化
     */
    Custom_table.prototype.init = function(options) {
        //判断当前表格是否初始化了
        
        this.options=options;
        this.el=$(options.el).eq(0);
        this.el.children().remove();
        if(options.showPage !== undefined)
        {
            this.pageOptions.showPage=options.showPage;
        }
        //获取表格数据
        this.ajaxRequest=options.ajaxRequest;
        //事件注册
        this.events=options.events && options.events.length ? options.events : [];
        //列表table展示对象
        this.table = $('<table width="100%" border="'+ (options.border || 0) +'" cellspacing="0" cellpadding="0" class="table">');
    
    
        if (!options.headerHtml)
        {
            let t = '';
            let arr=[];
            if(getType(options['header']) == 'Array')
            {
                //列表table 列数
                this.columnNum =   options['header'].length;
                arr=options["header"];
            }else if(getType(options['header']) == 'Function'){
                //列表table 列数
                this.columnNum =   options['header']().length;
                arr=options["header"]() || [];
            }
            if (options.type=="select")
            {
                options.selectIndex=options.selectIndex || 0;
                this.columnNum++;
            }
            arr.forEach((v, i) => {
                if(options.selectIndex==i)
                {
                    t+="<th style='width:30px;'><input class='select_all' type='checkbox'/></th>"
                }
                t += `<th>${v}</th>`;
            });
            //表格头部
            this.tableHeader = $(`<thead><tr style="white-space: nowrap">${t}</tr></thead>`);
            var _this=this;
            this.table.on("change",'thead input.select_all',function(e){
                var index=$(this).parent().index();
                var f=$(this).prop("checked");
                if(f)
                {
                    //全选按钮
                    _this.table.find("td input[type='checkbox']").prop("checked", true);
                    
        
                }else{
                    //全选按钮
                    _this.table.find("td input[type='checkbox']").prop("checked", false);
                }
                options.checkedChange && options.checkedChange(e,{
                    type:'all',
                    value:f
                });
            })  
        }else{
            this.tableHeader = $(options.headerHtml);
            //列表table 列数
            this.columnNum =   options.colNum || 11;
        }
    
        //列表table body展示对象
        this.tableTbody = $(`<tbody id="acctItemTBody"></tbody>`);
        //列表table page展示对象
        if(this.pageOptions.showPage)
        {
            this.tablePageDiv = $(`<div id="acctItemTablePageDiv" class="page"></div>`);
        }
    
    
        this.table.append(this.tableHeader);
        this.table.append(this.tableTbody);
        var d=$("<div class='table-warp'></div>");
        d.append(this.table);
        this.el.append(d);
    
        this.tablePageDiv && this.el.append(this.tablePageDiv);
        //添加事件
        this.events.forEach((v)=>{
            this.table.on(v.type, v.selector, v.handle)
        });
        //列表行排列集函数
        this.renderRow = options['renderRow'];
    
        //数据加载完成后执行的自定义方法(可选)
        this.loadEndFun = options['loadEndFun'];
        //每页记录下拉框(可选)
        this.pageConfig = options['pageConfig'];
    
        if(options['pageSize']) {   // 如果设置了pageSize需要初始化
    
            this.pageOptions.pageSize = options['pageSize'];
            if( this.pageOptions.selectPageSize.indexOf(options['pageSize']) ==-1)
            {
                this.pageOptions.selectPageSize.unshift(options['pageSize']);
            }
        }
        // 初始化扩展参数
        this.ajaxRequest.apply(this);
        return this;
    };
    /**
     * 渲染
     */
    Custom_table.prototype.renderHeader=function(){
        let options=this.options;
        let t='';
        let arr=[];
        if(getType(options['header']) == 'Function'){
            //列表table 列数
            this.columnNum =   options['header']().length;
            if(options.type == 'select')
            {
                this.columnNum++;
            }
            arr=options["header"]() || [];
            arr.forEach((v, i) => {
                if(options.selectIndex==i)
                {
                    t+="<th style='width:30px;'><input class='select_all' type='checkbox'/></th>"
                }
                t += `<th>${v}</th>`;
            });
            //表格头部
            if(this.tableHeader)
            {   
                this.tableHeader=$(`<thead><tr>${t}</tr></thead>`);
                this.table.find('thead').replaceWith(this.tableHeader);
            }
        }
        return this;
    };
    /**
     * 针对输入自定义业务条件后查询,需要初始化到第一页(对外方法)
     */
    Custom_table.prototype.reset = function() {
        // 当前页号, 从1开始
        this.pageOptions.currentPage = 1;
        // 上一页 
        this.pageOptions.previousPage = 1;
        // 下一页
        this.pageOptions.nextPage = 1;
        // 总页数
        this.pageOptions.totlePage = 1;
        // 总记录数
        this.pageOptions.totleRows = 0;
        // 当前记录数开始序列,默认从0开始
        this.pageOptions.startNum = 0;
    };
    //更新表格
    Custom_table.prototype.refresh = function() {
        var tableBody = '';
        this.tableHeader.find("th input.select_all").prop("checked",false);
        this.renderHeader();
        if(null != this.pageData  && this.pageData.length > 0 ) {
    
            var seqNum = (this.pageOptions.currentPage-1)*this.pageOptions.pageSize +1; // 序号
            // 有记录
            for(var i = 0; i < this.pageData.length ; i ++ ) {
                var tempBean = this.pageData[i];
                // 执行外部封装的行处理展示对象
                var doubleRowStyle = i % 2 == 0 ? '' : 'class="tableWRow"';
                tableBody = tableBody + '<tr id="tr" rowEvent="' +i+ '" ' +doubleRowStyle+ '>';
                tableBody = tableBody + this.renderRow(seqNum + i,tempBean);
                tableBody = tableBody + '</tr>';
            }
            // this.tableT.html(tableBody);
            this.tableTbody.html(tableBody);
            this.pageOptions.totlePage=Math.ceil(this.pageOptions.totleRows / this.pageOptions.pageSize);
            // 初始化分页数据
            this.initTablePage();
    
        } else {
            // 无记录
            tableBody = '<tr class="noRecord">'
                    + '<td colspan="' +this.columnNum+ '" style="color: red;" align="center">没有相关记录</td>'
                    + '</tr>';
            this.tableTbody.html(tableBody);
            this.pageOptions.currentPage =1;
            this.pageOptions.totlePage=Math.ceil(this.pageOptions.totleRows / this.pageOptions.pageSize);
            // 初始化分页数据
            this.initTablePage();
    
        }
    };
    /**
     * 初始化分页操作区域数据
     */
    Custom_table.prototype.getPageControlHtml = function() {
      this.pageOptionslang = {
        // 每页显示
        displayPerPage: "每页显示",
        // 条
        item: "条",
        // 总
        total: "总",
        // 条记录
        records: "条记录",
        // 共
        together: "共",
        // 页
        page: "页",
        // 当前第
        currentFirst: "当前第",
        // 首页
        firstPage: "首页",
        // 上一页
        previousPage: "上一页",
        // 下一页
        nextPage: "下一页",
        //尾页
        lastPage: "尾页",
        // 每页
        eachPage: "每页",
        // 行
        row: "行",
        // 第
        first: "第"
      };
        var  pageControlHtml = '';
        // 每页显示按钮
        pageControlHtml += '<div style="display: none;" id="acctItempageSize">'+this.pageOptionslang.displayPerPage+'<select name="pageSize" id="pageSize" class="input45" goToPage="1" >';
    
        pageControlHtml += '</select>'+this.pageOptionslang.item+'&nbsp;</div>';
        // 统计数量
        pageControlHtml += '<span>'+this.pageOptionslang.total+'<font color="red">' +this.pageOptions.totleRows+ '</font>'+this.pageOptionslang.records+'</span>&nbsp;';
        pageControlHtml += '<span>'+this.pageOptionslang.together+'<font color="red">' +this.pageOptions.totlePage+ '</font>'+this.pageOptionslang.page+'</span>&nbsp;';
        pageControlHtml += ''+this.pageOptionslang.currentFirst+'<font color="red">' +this.pageOptions.currentPage+ '</font>'+this.pageOptionslang.page+'&nbsp;';
        // 首页按钮
        pageControlHtml += '<a id="firstA" href="javascript:void(0);" '+'>'+this.pageOptionslang.firstPage+'</a>&nbsp;';
        // 上一页按钮
        pageControlHtml += '<a id="upA" href="javascript:void(0);">'+this.pageOptionslang.previousPage+'</a>&nbsp;';
        // 下一页按钮
        pageControlHtml += '<a id="downA" href="javascript:void(0);">'+this.pageOptionslang.nextPage+'</a>&nbsp;';
        // 尾页按钮
        pageControlHtml += '<a id="lastA" href="javascript:void(0);" >'+this.pageOptionslang.lastPage+'</a>&nbsp;';
    
        if(true){
            pageControlHtml += ''+this.pageOptionslang.eachPage+'&nbsp';
            pageControlHtml += '<select id="EveryB"style="text-align:center;border:1px solid #b1c3e0;background:#fff;height:26px;line-height:26px;padding-bottom:0px;padding-left:10px;color:#5b6274;">';
            var tmp=this.pageOptions.selectPageSize;
            for(var i=0;i<tmp.length;i++)
            {
                pageControlHtml += '<option value="'+tmp[i]+'">'+tmp[i]+'</option>'
            }
            pageControlHtml += '</select>&nbsp'+this.pageOptionslang.row+'&nbsp;'+this.pageOptionslang.first+'&nbsp;';
    
        }
        
        pageControlHtml += '<input id="curPage" name="curPage" type="hidden" value="' +this.pageOptions.currentPage+ '" />';
        pageControlHtml += '<input name="pageNum" id="pageNum" class="page_inp" maxlength="8" />';
        if(this.pageConfig){
            pageControlHtml += ''+this.pageOptionslang.page+'';
        }
        pageControlHtml += '&nbsp;<a type="button" id="goButton" name="goButton" class="page_normal" goToPageByNum="">GO</a>&nbsp;&nbsp;';
        return pageControlHtml;
    };
    /**
     * 初始化分页page数据
     */
    Custom_table.prototype.initTablePage = function() {
        if(!this.pageOptions.showPage ) return;
        var thisObj = this;
        var tempPage = this.getPageControlHtml();
        this.tablePageDiv.html(tempPage);
        if(this.pageOptions.totlePage > 0) {    // 最大页数大于0
            // 单元格行点击事件
            this.tableTbody.on("",function(){
    
            });
            // 对点击首页按钮添加事件
            $(this.tablePageDiv.find('a[id=firstA]') ).on("click",function(){
                if(thisObj.pageOptions.currentPage>1)
                {
                    thisObj.goToPage(1);
                }
                
            });
            // 对点击上一页按钮添加事件
            $(this.tablePageDiv.find('a[id=upA]') ).on("click",function(){
                if(thisObj.pageOptions.currentPage-1>0)
                {
                    thisObj.goToPage(thisObj.pageOptions.currentPage-1);
                }
                
            });
    
            // 对点击下一页按钮添加事件
            $(this.tablePageDiv.find('a[id=downA]') ).on("click",function(){
                if(thisObj.pageOptions.currentPage+1<=thisObj.pageOptions.totlePage)
                {
                    thisObj.goToPage(thisObj.pageOptions.currentPage+1);
                }
                
            });
            // 对点击末页的按钮添加事件
            $(this.tablePageDiv.find('a[id=lastA]') ).on("click",function(){
                if(thisObj.pageOptions.currentPage!=thisObj.pageOptions.totlePage)
                {
                    thisObj.goToPage(thisObj.pageOptions.totlePage);
                }
                
            });
            // 对选择每页记录添加事件
            $(this.tablePageDiv.find('#EveryB') ).change(function(){ 
                thisObj.pageOptions.pageSize=$(this).children('option:selected').val();
                thisObj.pageOptions.currentPage = 1;
                thisObj.goToPage(thisObj.pageOptions.currentPage);
            });
            
            // 对点击GO的分页查询按钮添加事件
            this.tablePageDiv.find('#goButton').click(function() {
                thisObj.goToPageByNum();
            });
            
            // 对选择每页记录添加值
            this.tablePageDiv.find('#EveryB').val(this.pageOptions.pageSize);
        }
    };
    /**
     * 分页查询中点击翻页按钮的查询事件
     * @param pageNum
     */
    Custom_table.prototype.goToPage = function(pageNum) {
        var selectedPageSize = this.tablePageDiv.find('#pageSize').val();
        if(selectedPageSize && selectedPageSize.length > 0) {
            this.pageOptions.pageSize = parseInt(selectedPageSize);
        }
        this.pageOptions.currentPage=parseInt(pageNum);
        this.tablePageDiv.find('#curPage').val(pageNum);
        this.ajaxRequest.apply(this);
    };
    /**
     * 分页查询中点击“Go”去指定页数的查询事件
     */
    Custom_table.prototype.goToPageByNum = function() {
        var pageNum = this.tablePageDiv.find('#pageNum').val();
        if('' != pageNum && pageNum.match(/^[0-9]*[1-9][0-9]*$/)) {
            pageNum = parseInt(pageNum);
            if(this.pageOptions.totlePage >= pageNum ) {
    
                this.pageOptions.currentPage=pageNum;
    
                this.tablePageDiv.find('#curPage').val(pageNum);
                this.ajaxRequest.apply(this);
            }
        }
    };
    /**
     * 选择页数的查询事件
     */
    Custom_table.prototype.goEveryByNum = function(num) {
        this.pageOptions.pageSize = num;
        this.pageOptions.startNum = 0;
        this.pageOptions.currentPage = 1;
        this.tablePageDiv.find('#pageSize').val(num);
        this.ajaxRequest.apply(this);
    };
    window.Custom_table = Custom_table;
    
    

    style.scss 文件

    .vk_table_warp table {border:1px solid #bacae3;line-height:35px;text-align:center;}
    .vk_table_warp table thead th {background:#ebeff8;font-weight:normal;}
    .vk_table_warp table thead th,.table tbody td {border-right:1px solid #dee5f4; padding: 0 5px;}
    .vk_table_warp table thead th.nor,.table tbody td.nor {border-right:0;}
    .vk_table_warp table tbody td.text {text-align:right;padding-right:10px;}
    .vk_table_warp table tbody tr:hover {background:#ebeff8;} /*这个将是鼠标高亮行的背景色*/
    .vk_table_warp table tbody tr td a {margin:0 5px;color:#4eb2e1;text-decoration:underline;}
    .vk_table_warp table tbody tr td a:hover {color:#4eb2e1;text-decoration:none;}
    .vk_table_warp table tbody tr td.text a {color:#5b6274;text-decoration:none;}
    .vk_table_warp table tbody tr td.price {line-height:35px;text-align:right;padding-right:10px;border-top:1px solid #dee5f4;}
    .vk_table_warp table a.block {background:#4eb2e1;color:#fff;display:block;text-decoration:none;}
    .vk_table_warp .tableWRow { background: #f6f7f9;}
    
    /*分页*/
    .vk_table_warp .page{zoom:1; text-align:right;border:1px solid #bacae3;border-top:0;padding:10px 0; box-sizing: border-box;}
    .vk_table_warp .page a{padding:5px 8px;border:1px solid #dedede;margin-right:3px;text-decoration:none;background:#fff;color:#5b6274;} 
    .vk_table_warp .page a:hover,.page a.hover{color:#fff;background:#4eb2e1;}
    .vk_table_warp .page_inp{width:48px;height:22px;line-height:22px;border:1px solid #dedede;text-align:center;margin-right:3px;}
    .vk_table_warp .page a.page_normal{padding:0;border:0;margin:0;background:none;font-weight:bold;}
    .vk_table_warp .page a.page_normal:hover{color:#5b6274;background:none;}
    

    在我们使用的时候就可以直接用到,
    html 用

    <div id="accountingOrganizationAuthorityManageTable" class="vk_table_warp"></div>
    

    js 用

      let self = new Custom_table();
      self.init({
        el: '#accountingOrganizationAuthorityManageTable',
        header: ["序号","用户名","员工姓名","全局", "启用", "操作"],
        pageSize: 10, // 每页显示的条数,可以不设定,默认是20,
        ajaxRequest: function() { //请求数据,默认传入当前的页码
          // 请求的方法
            getData((res) => {
               // 重新刷新页面
                self.pageData = res.rows;
                self.pageOptions.totleRows = res.total;
                self.refresh();
            })
        },
        //点击行时出发回调 
        events: [{
          //选择器 获取编辑事件
          selector: "span.edit",
          //事件类型
          type: 'click',
          //事件处理函数
          handle: function (e) {
              //获取当前行的数据
              let index = $(this).parents("tr").index();
              let data = self.pageData[index]
              console.log(data);
          }
      },{
          //选择器 获取详情事件
          selector: "span.detail",
          //事件类型
          type: 'click',
          //事件处理函数
          handle: function (e) {
              //获取当前行的数据
              let index = $(this).parents("tr").index();
              let data = self.pageData[index]
              console.log(data);
          }
      }
    ],
        renderRow: function(seq, t) { //表格每行数据的渲染
            return `<td>${seq}</td>`+
                `<td>${t.userName || ''}</td>`+
                `<td>${t.employeeName || ''}</td>`+
                `<td>${t.companyCode || ''}</td>`+
                `<td>${t.companyFullName || ''}</td>`+
                `<td>${t.companyTypeName || ''}</td>`+
                `<td>${t.parentCode || ''}</td>`+
                `<td>${t.parentName || ''}</td>`+
                `<td>${t.globalFlagName || ''}</td>`+
                `<td>${t.enabledFlagName || ''}</td>`+
                `<td><span class='handle vk_cell_primary edit'>编辑</span>
                 <span class='handle vk_cell_primary detail'>详情</span></td>`;
        }
      });
    

    相关文章

      网友评论

        本文标题:jq 封装table 组件

        本文链接:https://www.haomeiwen.com/subject/ogixwktx.html