自己实现的数据表格控件(dataTable),支持自定义样式和标题数据、ajax等各种自定义设置以及分页自定义
- 2019 年 11 月 1 日
- 筆記
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/eguid_1/article/details/76021437
一、前言
也没什么好说的嘛,用了蛮多github上开源的能够实现dataTable功能的表格插件,不过都默认绑定样式啊,数据格式也设定的比较死,所以忍不住自己实现了一个简单的可自定义样式和自定义数据返回格式的数据表格插件,原生js是保留的,后面如果更新新版本的话会去除对jquery依赖。实话实说,分页确实没做好,自定义样式后面抽空会继续完善。
二、实现功能
一个较高自定义式的数据表格插件,无默认样式文件
三、使用实例
可以自行定义每个标题的样式,可以style,也可以指定class;
分页那里必须指定调用的API
//所有配置的顺序可以随便排序,不一样要按照我这个顺序, var table =new Tables({'id':'#dataTables',//必须,绑定的table,可以是Dom对象(因为底层直接用的$(id),所以像jquery一样用就ok,简单方便) 'pageSize':15,//每页显示行数 'titles':{"序号":{'style':'width:10%','className':''},"类别":{'style':'width:10%','className':''},"编码":{'style':'width:10%','className':''},"名称":{'style':'width:30%','className':''},"备注":{'style':'width:20%','className':''},"操作":{'style':'width:20%','className':''}},//必须,表格的标题,其实后面的值是可以为空的,后面考虑到要增加复杂结构的标题头生成,所以预留 'fields':{ "1":{"render":function(data,index,f){return index;}}, "dictionarykind":"",//支持render修改列的展示值 "dictionarycode":"", "dictionaryvalue":"", "remark":{"render":function(data,index,f){if(isNull(f)){return "";}return f}}, "":{'render':function(data,index,f){return "<a href=javascript:javascript:update('" +data.dictionaryid +"','"+index+"')> 修改 </a> <a href=javascript:javascript:remove('" +data.dictionaryid +"','"+index+"')> 删除 </a>"}},//可以出现空字段,不会绑定到表格数据(一般情况下是为了加入控制按钮啥的) "dictionaryid":"", },//必须,字段映射,与返回数据相同既可以把字段映射到每列,这个就不需要讲了,主要是后面的render可以修改返回参数,另外超出标题数量的字段是会自动隐藏的 'ajaxParam':{ type:"POST", dataType:"json", async:false, url:"cc/eguid/queryList", data:function(d){var id=$("#camera_org").val();d.dictionarykind=id;/*这里可以重设参数,内置参数只有pageIndex和pageSize两个*/return d;}, },//必须,ajax请求,跟jquery的ajax参数一样,好吧,作者偷懒!直接用的$.ajax(ajaxParam)实现的。 -|-心好累 'dataRender':function(data){return data.data;},//必须,因为不清楚返回数据的格式,所以必须通过render方法进行定义 'control':{ "previous":'table.previous()',//上一页,可以是其他第三方分页插件的API "next":'table.next()'//下一页,同上 }//必须,分页控制等控件的详细配置 }); table.ajax(); });
四、数据表格插件源码
/*eguid的数据表格控件*/ var Tables=(function(param){ var isNull=function(s){return s==undefined||typeof(s)=='underfinded'||s==null||s==''}; var getDom=function(id){return document.getElementById(id);}; //数据处理 var dataHandler=function(data){ dataBody=""; tableDom.find("tbody").html(""); for(var i=0;i<pageSize;i++){ var row=data[i]; if(isNull(row)){//如果为空,说明数据结束 break; }else{ rowHandler(row,i); } } tableDom.find("tbody").append(dataBody); retData=data; var num=1; if(count>pageSize){ var t1=count/pageSize;num=t1.toFixed(0);if(num<t1){++num;} } getDom("cupageTotal").innerHTML=num; } //处理一行数据 var rowHandler=function(row,i){ dataBody+="<tr>"; var len=titleNum; for(field in fields){ var col=row[field]; var temp=len>0?"<td>":"<td style='visibility:hidden'>"; len--; var render=fields[field]["render"]; if(isNull(render)){ temp+=(col+"</td>"); }else{ var renderRet=render(row,i+1,row[field]); temp+=(isNull(renderRet)?"":renderRet+"</td>"); } dataBody+=temp; } dataBody+="</tr>"; } //请求后预处理 var ajaxHandler=function(data,type){ if(!isNull(data)){ var ret=dataRender(data); count=ret.count; dataHandler(ret.data); } }; //新增ajax请求完成处理操作 var ajaxReq=function (b){ if(isNull(b)||!b){reloadParam();} var d={"pageSize":pageSize,"pageIndex":((pageIndex-1)*pageSize)}; ajaxComParam.data=isNull(ajaxDataParam)?d:ajaxDataParam(d); $.ajax(ajaxComParam); }; var pageNext=function(){ if(pageIndex<(count/pageSize)){ getDom("cuPageNum").innerHTML=++pageIndex; } var d={"pageSize":pageSize,"pageIndex":pageIndex}; ajaxReq(true); return d; }; var pagePrevious=function(){ if(pageIndex>1){ getDom("cuPageNum").innerHTML=--pageIndex; } var d={"pageSize":pageSize,"pageIndex":pageIndex}; ajaxReq(true); return d; }; var reloadParam=function(){ getDom("cuPageNum").innerHTML=pageIndex=1; }; //初始化表标题;id:表格ID,titles:标题列表,titleNum:标题数量(超出该数量的列自动隐藏),fields:字段 var id=param.id,titles=param.titles,titleNum=0,fields=param.fields; //pageSize:分页数量,pageIndex:分页索引(当前页),count:数据总行数(count/pageSize等于总页数) var pageSize=isNull(param.pageSize)?10:param.pageSize,pageIndex=1,count; var ajaxComParam;//请求参数 var ajaxDataParam;//ajax请求的data参数 var dataRender=param.dataRender;//返回表格数据的具体位置定位 var tableDom;//表格Dom var dataBody;//数据体node var retData;//保存每次接收到的ajax数据 var control=param.control;//分页控件的配置 /*字段值初始化*/ var initTableHead=function(row){ var thead= "<thead><tr>"; for(title in titles){ var conf=titles[title]; var stl=isNull(conf.style)?"":" style='"+conf.style+"' "; var cla=isNull(conf.className)?"":" class='"+conf.className+"' "; thead+="<td"+stl+">"+title+"</td>"; ++titleNum; } thead+="</tr></thead>"; return thead; } var initTableBody=function(){ var tbody="<tbody></tbody>"; return tbody; } var initTableFoot=function(){ var tfoot="<tfoot><tr>"; tfoot+="<td colspan='"+titleNum+"'><span>总页数:</span><span id='cupageTotal'>"+1+"</span> <span>当前页:</span><span id='cuPageNum'>"+1+"</span>"; tfoot+=" <button οnclick='"+(isNull(control.previous)?'javascript:void(0);':control.previous)+"'> 上一页 </button> <button οnclick='"+(isNull(control.next)?'javascript:void(0);':control.next)+"'> 下一页 </button>" tfoot+="</td></tr></tfoot>"; return tfoot; } var initTableNode=function(){ tableDom=$(id).append(initTableHead(titles)+initTableBody()+initTableFoot()); } var initAjaxParam=function(){ ajaxComParam=param.ajaxParam; if(ajaxComParam.data.constructor===Function){ ajaxDataParam=ajaxComParam.data; } ajaxComParam.success=ajaxHandler; } var initAll=function(){ initAjaxParam(); initTableNode(); }; initAll(); //公开接口 return{ ajax:ajaxReq,//异步加载 json:dataHandler,//嘛,直接导入json next:pageNext,//下一页 previous:pagePrevious,//上一页 } });
话说开放的API只有四个(不算初始化的话),如果要增加一些API可以自己在return的对象中自行加入即可