自己实现的数据表格控件(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 ...
随机推荐
- MVC4加载zTree树小控件
前言: 第一次学习使用MVC框架,找了个练手项目,加载zTree树小控件.下面我就一步步说明我这次练手的经历以记录.如果有什么错误,希望各位大神帮忙指正,谢谢. 第一步: 利用VS2010新建一个MV ...
- [python标准库]XML模块
1.什么是XML XML是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分.您可以创建内容,然后使用限定标记标记它,从而使每个单词. ...
- 模拟对象测试——EasyMock
一.EasyMock 使用动态代理实现模拟对象创建,一般可以满足以下测试需求 1.要测试的模块依赖于其它自己控制不了的模块,如第三方服务,其它组员在开发的服务等,它们都没办法配合你来测试: 2.涉及到 ...
- require 增量更新与版本管理
使用require.js 加载JS文件时,当JS文件有更新,可以通过更改全局版本号( urlArgs : 'v=1'),告诉浏览器加载新的文件. 但该方法虽然使用方便,但美中不足的是有些不需要更新的文 ...
- Linux常见命令(二)
随着Linux应用的扩展许多同学开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起.虽然Linux桌面应用发展很快,但是命令在Linux中依然有很强的生命力.Li ...
- HTTPS系列干货(一):HTTPS 原理详解
HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一个新鲜协议,Google 很早就开始启用了,初衷 ...
- cookie的路径问题
今天公司网站(不考虑跨域访问情况)有个需求就是在一个路径下存一个cookie 比如这样 www.fdf.com/vichain/dashback/myback 在这个目录下存放一个cookie 在这 ...
- canvas学习总结三:绘制路径-线段
Canvas绘图环境中有些属于立即绘制图形方法,有些绘图方法是基于路径的. 立即绘制图形方法仅有两个strokeRect(),fillRect(),虽然strokezText(),fillText() ...
- CSS中可以通过哪些属性定义,使得一个DOM元素不显示在浏览器可视范围内?
最基本的: 设置display属性为none,或者设置visibility属性为hidden 技巧性: 设置宽高为0,设置透明度为0,设置z-index位置在-1000
- Java 基础 break和continue关键字的使用
break&continue关键字的使用 break:使用在switch...case语句或者循环结构语句中,表示结束当前循环. 示例代码: public class TestBreak { ...