自己实现的数据表格控件(dataTable),支持自定义样式和标题数据、ajax等各种自定义设置以及分页自定义
一、前言
也没什么好说的嘛,用了蛮多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 onclick='"+(isNull(control.previous)?'javascript:void(0);':control.previous)+"'> 上一页 </button> <button onclick='"+(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的对象中自行加入即可
自己实现的数据表格控件(dataTable),支持自定义样式和标题数据、ajax等各种自定义设置以及分页自定义的更多相关文章
- 数据表格控件 DataGridControl
数据表格控件 书154页 <?xml version="1.0" encoding="utf-8"?> <s:Application xmln ...
- 在GridControl表格控件中实现多层级主从表数据的展示
在一些应用场景中,我们需要实现多层级的数据表格显示,如常规的二级主从表数据展示,甚至也有多个层级展示的需求,那么我们如何通过DevExpress的GridControl控表格件实现这种业务需求呢?本篇 ...
- [ PyQt入门教程 ] PyQt5中数据表格控件QTableWidget使用方法
如果你想让你开发的PyQt5工具展示的数据显得整齐.美观.好看,显得符合你的气质,可以考虑使用QTableWidget控件.之前一直使用的是textBrowser文本框控件,数据展示还是不太美观.其中 ...
- 表格控件表头栏目(Column)与数据表头步
不用手工增加栏目的列,也就是Column,由数据库的查询结果自动创建. 用的是Delphi2010,安装了Dev,用CxGrid显示数据库查询结果.用什么控件没有关键,道理相同的.
- jQuery数据表格控件boostrap-table
表格初始化js代码 function TableInit() { $("#edit").attr({"disabled":"disabled" ...
- 最好的Angular2表格控件
现在市面上有大量的JavaScript数据表格控件,包括开源的第三方的和自产自销的.可以说Wijmo的Flexgrid是目前适应Angular 2的最好的表格控件. Angular 2数据表格基本要求 ...
- Ext入门学习系列(五)表格控件(2)
上节学习了Ext中表格控件,从创建,到定义数据源.绑定显示,大体明白了一个基本的表格控件是怎么实现的.而我们用表格控件多用于从各种数据源接收数据并显示出来,并不是写死的.本章我们就不同数据源的不同实现 ...
- 【案例分享】在 React 框架中使用 SpreadJS 纯前端表格控件
[案例分享]在 React 框架中使用 SpreadJS 纯前端表格控件 本期葡萄城公开课,将由国电联合动力技术有限公司,资深前端开发工程师——李林慧女士,与大家在线分享“在 React 框架中使用 ...
- Atitit 项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx
Atitit 项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx 1. 场景:应用在项目列表查询场景下1 1.1. 预计初步掌握vue ...
随机推荐
- NOSQL基础概念
NoSql是一个很老的概念了,但对自己来说,仍然是一个短板,果断补上. 首先通过几个简单的例子来了解NOSQL在国内的情况(2013年左右的数据,有些过时),比如新浪微博,其就有200多台物理机运行着 ...
- java基础(二章)
java基础(二章) 一,变量 1.变量是内存中的一个标识符号,用于存储数据 2.变量命名规则 l 必须以字母.下划线 _ .美元符号 $ 开头 l 变量中,可以包括数字 l 变量中,不能出现特 ...
- 用 Hexo + Github 搭建自己的博客
扯在前面 在很久很久以前,一直就想搭建属于自己的一个博客,但由于各种原因,最终都不了了之,恰好最近突然有了兴趣,于是就自己参照网上的教程,搭建了属于自己的博客. 至于为什么要搭建自己的博客了?哈哈,大 ...
- map,zip,reduce函数
lt=range(5,10) lw=range(8,13) def mul(a,b): return a*b def mul_list(param1,param2): return_list=[] f ...
- iframe实现自适应高度
代码简单,兼容性还可以 <script>function SetWinHeight(obj) { var win=obj; if (document.getElementById) ...
- django 自定义过滤器(filter)处理较为复杂的变量的实例
简述:django 在views中有数据需要通过字典(dict)的方式传递给template,该字典中又包含了字典,而且字典中的键值还是一个对象,在template中处理传递过来的数据的时候,字典不能 ...
- Angular JS从入门基础 mvc三层架构 常用指令
Angular JS从入门基础 mvc模型 常用指令 ★ 最近一直在复习AngularJS,它是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核心 ...
- PHPCMS v9 自定义表单添加验证码
1. 在 \phpcms\templates\default\formguide\show.html 中添加验证码显示 <input type="text" id=&quo ...
- python flask(多对多表查询)
我们在flask的学习中,会难免遇到多对多表的查询,今天我也遇到了这个问题.那么我想了好久.也没有想到一个解决的办法,试了几种方法,可能是思路的限制我放弃了,后来,我就在网上百度,可是发现百度出来的结 ...
- chrome 浏览器最小字体为12px 的解决办法
http://banri.me/web/webkit-text-size-adjust.html 对div进行缩放 12*0,75 = 9 px -webkit-transform: scale(0. ...