一、前言

也没什么好说的嘛,用了蛮多github上开源的能够实现dataTable功能的表格插件,不过都默认绑定样式啊,数据格式也设定的比较死,所以忍不住自己实现了一个简单的可自定义样式和自定义数据返回格式的数据表格插件,原生js是保留的,后面如果更新新版本的话会去除对jQuery依赖。实话实说,分页确实没做好,自定义样式后面抽空会继续完善。

二、实现功能

一个较高自定义式的数据表格插件,无默认样式文件

三、使用实例

可以自行定义每个标题的样式,可以style,也可以指定class;

分页那里必须指定调用的API

  1. //所有配置的顺序可以随便排序,不一样要按照我这个顺序,
  2. var table =new Tables({'id':'#dataTables',//必须,绑定的table,可以是Dom对象(因为底层直接用的$(id),所以像jquery一样用就ok,简单方便)
  3. 'pageSize':15,//每页显示行数
  4. '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':''}},//必须,表格的标题,其实后面的值是可以为空的,后面考虑到要增加复杂结构的标题头生成,所以预留
  5. 'fields':{
  6. "1":{"render":function(data,index,f){return index;}},
  7. "dictionarykind":"",//支持render修改列的展示值
  8. "dictionarycode":"",
  9. "dictionaryvalue":"",
  10. "remark":{"render":function(data,index,f){if(isNull(f)){return "";}return f}},
  11. "":{'render':function(data,index,f){return "<a href=javascript:javascript:update(\'" +data.dictionaryid +"\',\'"+index+"\')> 修改 </a> <a href=javascript:javascript:remove(\'" +data.dictionaryid +"\',\'"+index+"\')> 删除 </a>"}},//可以出现空字段,不会绑定到表格数据(一般情况下是为了加入控制按钮啥的)
  12. "dictionaryid":"",
  13. },//必须,字段映射,与返回数据相同既可以把字段映射到每列,这个就不需要讲了,主要是后面的render可以修改返回参数,另外超出标题数量的字段是会自动隐藏的
  14. 'ajaxParam':{
  15. type:"POST",
  16. dataType:"json",
  17. async:false,
  18. url:"cc/eguid/queryList",
  19. data:function(d){var id=$("#camera_org").val();d.dictionarykind=id;/*这里可以重设参数,内置参数只有pageIndex和pageSize两个*/return d;},
  20. },//必须,ajax请求,跟jquery的ajax参数一样,好吧,作者偷懒!直接用的$.ajax(ajaxParam)实现的。 -|-心好累
  21. 'dataRender':function(data){return data.data;},//必须,因为不清楚返回数据的格式,所以必须通过render方法进行定义
  22. 'control':{
  23. "previous":'table.previous()',//上一页,可以是其他第三方分页插件的API
  24. "next":'table.next()'//下一页,同上
  25. }//必须,分页控制等控件的详细配置
  26. });
  27. table.ajax();
  28. });

四、数据表格插件源码

  1. /*eguid的数据表格控件*/
  2. var Tables=(function(param){
  3. var isNull=function(s){return s==undefined||typeof(s)=='underfinded'||s==null||s==''};
  4. var getDom=function(id){return document.getElementById(id);};
  5. //数据处理
  6. var dataHandler=function(data){
  7. dataBody="";
  8. tableDom.find("tbody").html("");
  9. for(var i=0;i<pageSize;i++){
  10. var row=data[i];
  11. if(isNull(row)){//如果为空,说明数据结束
  12. break;
  13. }else{
  14. rowHandler(row,i);
  15. }
  16. }
  17. tableDom.find("tbody").append(dataBody);
  18. retData=data;
  19. var num=1;
  20. if(count>pageSize){
  21. var t1=count/pageSize;num=t1.toFixed(0);if(num<t1){++num;}
  22. }
  23. getDom("cupageTotal").innerHTML=num;
  24. }
  25. //处理一行数据
  26. var rowHandler=function(row,i){
  27. dataBody+="<tr>";
  28. var len=titleNum;
  29. for(field in fields){
  30. var col=row[field];
  31. var temp=len>0?"<td>":"<td style='visibility:hidden'>";
  32. len--;
  33. var render=fields[field]["render"];
  34. if(isNull(render)){
  35. temp+=(col+"</td>");
  36. }else{
  37. var renderRet=render(row,i+1,row[field]);
  38. temp+=(isNull(renderRet)?"":renderRet+"</td>");
  39. }
  40. dataBody+=temp;
  41. }
  42. dataBody+="</tr>";
  43. }
  44. //请求后预处理
  45. var ajaxHandler=function(data,type){
  46. if(!isNull(data)){
  47. var ret=dataRender(data);
  48. count=ret.count;
  49. dataHandler(ret.data);
  50. }
  51. };
  52. //新增ajax请求完成处理操作
  53. var ajaxReq=function (b){
  54. if(isNull(b)||!b){reloadParam();}
  55. var d={"pageSize":pageSize,"pageIndex":((pageIndex-1)*pageSize)};
  56. ajaxComParam.data=isNull(ajaxDataParam)?d:ajaxDataParam(d);
  57. $.ajax(ajaxComParam);
  58. };
  59. var pageNext=function(){
  60. if(pageIndex<(count/pageSize)){
  61. getDom("cuPageNum").innerHTML=++pageIndex;
  62. }
  63. var d={"pageSize":pageSize,"pageIndex":pageIndex};
  64. ajaxReq(true);
  65. return d;
  66. };
  67. var pagePrevious=function(){
  68. if(pageIndex>1){
  69. getDom("cuPageNum").innerHTML=--pageIndex;
  70. }
  71. var d={"pageSize":pageSize,"pageIndex":pageIndex};
  72. ajaxReq(true);
  73. return d;
  74. };
  75. var reloadParam=function(){
  76. getDom("cuPageNum").innerHTML=pageIndex=1;
  77. };
  78. //初始化表标题;id:表格ID,titles:标题列表,titleNum:标题数量(超出该数量的列自动隐藏),fields:字段
  79. var id=param.id,titles=param.titles,titleNum=0,fields=param.fields;
  80. //pageSize:分页数量,pageIndex:分页索引(当前页),count:数据总行数(count/pageSize等于总页数)
  81. var pageSize=isNull(param.pageSize)?10:param.pageSize,pageIndex=1,count;
  82. var ajaxComParam;//请求参数
  83. var ajaxDataParam;//ajax请求的data参数
  84. var dataRender=param.dataRender;//返回表格数据的具体位置定位
  85. var tableDom;//表格Dom
  86. var dataBody;//数据体node
  87. var retData;//保存每次接收到的ajax数据
  88. var control=param.control;//分页控件的配置
  89. /*字段值初始化*/
  90. var initTableHead=function(row){
  91. var thead= "<thead><tr>";
  92. for(title in titles){
  93. var conf=titles[title];
  94. var stl=isNull(conf.style)?"":" style='"+conf.style+"' ";
  95. var cla=isNull(conf.className)?"":" class='"+conf.className+"' ";
  96. thead+="<td"+stl+">"+title+"</td>";
  97. ++titleNum;
  98. }
  99. thead+="</tr></thead>";
  100. return thead;
  101. }
  102. var initTableBody=function(){
  103. var tbody="<tbody></tbody>";
  104. return tbody;
  105. }
  106. var initTableFoot=function(){
  107. var tfoot="<tfoot><tr>";
  108. tfoot+="<td colspan='"+titleNum+"'><span>总页数:</span><span id='cupageTotal'>"+1+"</span> <span>当前页:</span><span id='cuPageNum'>"+1+"</span>";
  109. tfoot+=" <button onclick='"+(isNull(control.previous)?'javascript:void(0);':control.previous)+"'> 上一页 </button> <button onclick='"+(isNull(control.next)?'javascript:void(0);':control.next)+"'> 下一页 </button>"
  110. tfoot+="</td></tr></tfoot>";
  111. return tfoot;
  112. }
  113. var initTableNode=function(){
  114. tableDom=$(id).append(initTableHead(titles)+initTableBody()+initTableFoot());
  115. }
  116. var initAjaxParam=function(){
  117. ajaxComParam=param.ajaxParam;
  118. if(ajaxComParam.data.constructor===Function){
  119. ajaxDataParam=ajaxComParam.data;
  120. }
  121. ajaxComParam.success=ajaxHandler;
  122. }
  123. var initAll=function(){
  124. initAjaxParam();
  125. initTableNode();
  126. };
  127. initAll();
  128. //公开接口
  129. return{
  130. ajax:ajaxReq,//异步加载
  131. json:dataHandler,//嘛,直接导入json
  132. next:pageNext,//下一页
  133. previous:pagePrevious,//上一页
  134. }
  135. });

话说开放的API只有四个(不算初始化的话),如果要增加一些API可以自己在return的对象中自行加入即可

自己实现的数据表格控件(dataTable),支持自定义样式和标题数据、ajax等各种自定义设置以及分页自定义的更多相关文章

  1. 数据表格控件 DataGridControl

    数据表格控件 书154页 <?xml version="1.0" encoding="utf-8"?> <s:Application xmln ...

  2. 在GridControl表格控件中实现多层级主从表数据的展示

    在一些应用场景中,我们需要实现多层级的数据表格显示,如常规的二级主从表数据展示,甚至也有多个层级展示的需求,那么我们如何通过DevExpress的GridControl控表格件实现这种业务需求呢?本篇 ...

  3. [ PyQt入门教程 ] PyQt5中数据表格控件QTableWidget使用方法

    如果你想让你开发的PyQt5工具展示的数据显得整齐.美观.好看,显得符合你的气质,可以考虑使用QTableWidget控件.之前一直使用的是textBrowser文本框控件,数据展示还是不太美观.其中 ...

  4. 表格控件表头栏目(Column)与数据表头步

    不用手工增加栏目的列,也就是Column,由数据库的查询结果自动创建. 用的是Delphi2010,安装了Dev,用CxGrid显示数据库查询结果.用什么控件没有关键,道理相同的.

  5. jQuery数据表格控件boostrap-table

    表格初始化js代码 function TableInit() { $("#edit").attr({"disabled":"disabled" ...

  6. 最好的Angular2表格控件

    现在市面上有大量的JavaScript数据表格控件,包括开源的第三方的和自产自销的.可以说Wijmo的Flexgrid是目前适应Angular 2的最好的表格控件. Angular 2数据表格基本要求 ...

  7. Ext入门学习系列(五)表格控件(2)

    上节学习了Ext中表格控件,从创建,到定义数据源.绑定显示,大体明白了一个基本的表格控件是怎么实现的.而我们用表格控件多用于从各种数据源接收数据并显示出来,并不是写死的.本章我们就不同数据源的不同实现 ...

  8. 【案例分享】在 React 框架中使用 SpreadJS 纯前端表格控件

    [案例分享]在 React 框架中使用 SpreadJS 纯前端表格控件 本期葡萄城公开课,将由国电联合动力技术有限公司,资深前端开发工程师——李林慧女士,与大家在线分享“在 React 框架中使用 ...

  9. Atitit  项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx

    Atitit  项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx 1. 场景:应用在项目列表查询场景下1 1.1. 预计初步掌握vue ...

随机推荐

  1. ionic2新手入门整理,搭建环境,创建demo,打包apk,热更新,优化启动慢等避坑详解

    onic官方文档链接:http://ionicframework.com/docs/ 如果是新的环境会有很多坑,主要是有墙,请仔细阅读每个步骤 文档包含以下内容: l  环境搭建 l  创建demo并 ...

  2. angular2/angular4 如何通过$http的post方法请求下载二进制的Excel文件

    时间有限,废话就不多说了,直接上干货! 下面给大家介绍一下我遇到的一个坑,如果你也遇到了,那恭喜你,你一定能找到答案:angular2/angular4 如何通过$http的post方法请求下载二进制 ...

  3. 几个常用的linux命令(操作服务器时会用到)

    目录 tmux 背景 安装 使用 启动一个tmux session 暂时离开当前session 回到之前的session 重命名session 创建window 创建pane ps scp 参考 tm ...

  4. SQL中创建外键约束

    alter table 表名 add constraint 外键约束名 foreign key(列名) references 引用外键表(列名)

  5. AngularJS高级程序设计读书笔记 -- 过滤器篇

    一. 过滤器基础 过滤器用于在视图中格式化展现给用户的数据. 一旦定义过滤器之后, 就可在整个模块中全面应用, 也就意味着可以用来保证跨多个控制器和视图之间的数据展示的一致性. 过滤器将数据在被指令处 ...

  6. 移动端响应式布局+rem+calc()

    1.媒体查询:@media only screen and (max-width: ) {},在最初做pc端时,使用各种媒体查询,因为pc的屏幕分辨率总共就几种,不嫌麻烦的重复使用类名.有很大的缺陷就 ...

  7. OS X 和iOS 中的多线程技术(下)

    OS X 和iOS 中的多线程技术(下) 上篇文章中介绍了 pthread 和 NSThread 两种多线程的方式,本文将继续介绍 GCD 和 NSOperation 这两种方式.. 1.GCD 1. ...

  8. 关于MATLAB处理大数据坐标文件201761

    前几天备战考试,接下来的日子将会继续攻克大数据比赛 虽然停止了一段时间没有提交数据,但是这几天的收获还是有的,对Python 随机森林了解的更了解了 随机森林是由多课决策树组成(当然这个虽然我们初学者 ...

  9. java数组降序排序之冒泡排序

    import java.util.Arrays;//必须加载 class Demo{ public static void main(String []args){ int[] arr={3,54,4 ...

  10. 将Win7系统将默认打开的库改为计算机