一、介绍
Datatables是一款jquery表格插件。它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能。
- 分页,即时搜索和排序
- 几乎支持任何数据源:DOM, javascript, Ajax 和 服务器处理
- 支持不同主题 DataTables, jQuery UI, Bootstrap, Foundation
- 各式各样的扩展: Editor, TableTools, FixedColumns ……
- 丰富多样的option和强大的API
- 支持国际化
- 超过2900+个单元测试
二、引入
<link rel="stylesheet" type="text/css" href="/DataTables-1.10.7/css/jquery.dataTables.css">
<!-- jQuery -->
<script type="text/javascript" charset="utf8" src="/DataTables-1.10.0/js/jquery.js"></script>
<!-- DataTables -->
<script type="text/javascript" charset="utf8" src="/DataTables-1.10.7/js/jquery.dataTables.js"></script>
三、html
<table class="table table-bordered table-hover" id="bigDataList">
<thead>
<tr>
<th>
用户id
</th>
<th>
主叫
</th>
<th>
识别码
</th>
<th>
区域id
</th>
<th>
服务类型
</th>
<th>
服务组
</th>
<th>
位置区码
</th>
<th>
GPRS节点
</th>
<th>
分配记数
</th>
<th>
协议类型
</th>
<th>
开始时间
</th>
<th>
结束时间
</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
四、js代码
var table1;
//dataTable初始化对象
function bigDataTable(queryData){
table1= $('#bigDataList').DataTable({
"paging": true,
"lengthChange": true,
"searching": true,
"ordering": true,
"aaSorting" : [[0, "asc"]], //默认的排序方式,第1列,升序排列
"info": true,
"autoWidth": false,
"destroy":true,
"processing":true,
"scrollX": true, //水平新增滚动轴
// "serverSide":true, //true代表后台处理分页,false代表前台处理分页
"aLengthMenu":[10,15,20],
"PaginationType" : "full_numbers", //详细分页组,可以支持直接跳转到某页
//当处理大数据时,延迟渲染数据,有效提高Datatables处理能力
"deferRender": true,
"ajax":{
url:"getJson_BigData_queryDataByParams",
dataSrc:
function(data){
if(data.callbackCount==null){
data.callbackCount=0;
}
//抛出异常
if(data.sqlException){
alert(data.sqlException);
}
//查询结束取消按钮不可用
$("#queryDataByParams").removeAttr("disabled");
return data.dataList; //自定义数据源,默认为data
}, //dataSrc相当于success,在datatable里面不能用success方法,会覆盖datatable内部回调方法
type:"post",
data:queryData
},
columns:[
{ data: 'user_ip' },
{ data: 'calling'},
{ data: 'imei' },
{ data: 'cell_id'},
{ data: 'service_type' },
{ data: 'service_group'},
{ data: 'lac' },
{ data: 'sgsn'},
{ data: 'assignment_count' },
{ data: 'proto_type'},
{ data: 'start_time' },
{ data: 'end_time'},
],
/*是否开启主题*/
"bJQueryUI": true,
"oLanguage": { // 语言设置
"sLengthMenu": "每页显示 _MENU_ 条记录",
"sZeroRecords": "抱歉, 没有找到",
"sInfo": "从 _START_ 到 _END_ /共 _TOTAL_ 条数据",
"sInfoEmpty": "没有数据",
"sInfoFiltered": "(从 _MAX_ 条数据中检索)",
"sZeroRecords": "没有检索到数据",
"sSearch": "检索:",
"oPaginate": {
"sFirst": "首页",
"sPrevious": "前一页",
"sNext": "后一页",
"sLast": "尾页"
}
},
});
}
点击请求ajax,返回渲染数据:
//点击查询
$("#queryDataByParams").on("click",function() {
var reg = new RegExp("^[0-9]*$");
var startTime=$("#searchDateRange").val().substring(0,19).replace(/-/g, '/');
var endTime=$("#searchDateRange").val().substring(22,41).replace(/-/g, '/');
var date1=new Date(startTime); //开始时间
var date2=new Date(endTime); //结束时间
var date3=date2.getTime()-date1.getTime() //时间差的毫秒数
if(date3>60*60*24*1000){
alert("开始时间与结束时间间隔大于24小时!");
return false;
}
if(!$("#searchDateRange").val() || $("#searchDateRange").val()=="填写时间段"){
alert("时间区段不能为空!");
return false;
}
if(!$("#calling").val() && !reg.test($("#calling").val())){
alert("请输入全数字!");
}
//查询时候设置按钮不可用
$("#queryDataByParams").attr("disabled", true);
var queryData={"startseg":$("#searchDateRange").val(),
"callseg":$("#calling").val(),
"identifiCode":$("#identifiCode").val(),
"areaId":$("#areaId").val(),
"serviceType":$("#serviceType").val(),
"serviceGroup":$("#serviceGroup").val(),
"areaCode":$("#areaCode").val(),
"gprsNode":$("#gprsNode").val(),
"distritNum":$("#distritNum").val(),
"protocolType":$("#protocolType").val()
};
if(table1!=null || table1 !=undefined){
// dataTable初始化之后不能再设值,需要销毁重新定义,(数据量大时不适用)
// table1.destroy();
// bigDataTable(queryData);
// var src={
// url:"getJson_BigData_queryDataByParams",
// dataSrc :"dataList", //自定义数据源,默认为data
// type:"post",
// data:{"test":$("#protocolType").val()}
// };
// table1.fnSettings().ajax=src; //ajax访问数据
// table1.fnPageChange(0,true); //分页的页数从0开始
table1.settings()[0].ajax.data=queryData;
table1.ajax.reload();
}else{
bigDataTable(queryData);
}
});
上面是前台分页,如果要做后台分业,当然最好就是用后台分页:
1.修改datatable初始化属性,新增
"serverSide":true, //true代表后台处理分页,false代表前台处理分页
2.后台即可获取到每页数据,当前页参数
private int length;
private int start:
public int getLength(){
return length;
}
public void setLength(int length){
this.length = length;
}
public int getStart(){
return start;
}
public void setStart(int start){
this.start = start;
}
我的后台是用struts2写的,其他的也可以用request里面获取,这个值初始化设置之后会一起返回给后端的,然后后端操作数据库的时候,就可以根据这两个参数就行真分页了。
public String dataPaging(){
resultJson = new HashMap<String,Object>();
searchItem = getRequest().getParameter("extra_search");
List<Log> list = new ArrayList<Log>();
list = logService.queryForPaging(start,length,searchItem);
int count = logService.queryForPagingSize(searchItem);
resultJson.put("draw", Integer.toString(draw));
resultJson.put("recordsTotal", Integer.toString(count));
resultJson.put("recordsFiltered", Integer.toString(count));
resultJson.put("data", list);
return "success";
}
public List<T> queryForPaging(int start,int length,String query) {
Criteria cri = getSession().createCriteria(this.persistentClass);
cri.addOrder(Order.desc("id")).setFirstResult(start).setMaxResults(length);
if(query != null && !"".equals(query)){
cri.add(Restrictions.like("username", query, MatchMode.ANYWHERE));
}
List<T> list = cri.list();
return list;
}
前后台数据交互:
前台格式:
<table id="activityList" class="table table-bordered table-hover">
<thead>
<tr>
<th width="10%">ID</th>
<th width="15%">店铺名称</th>
<th width="15%">优惠活动</th>
<th width="15%">开始时间</th>
<th width="15%">结束时间</th>
<th width="15%">操作</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
columns:[
{ data: 'id' },
{ data: 'storeInfo.realName'},
{ data: 'content' },
{ data: 'startTime',
"render": function ( data, type, full, meta ) {
var dataStr = Date.parse(data);
return new Date(dataStr).Format("yyyy-MM-dd hh:mm:ss");
}
},
{ data: 'endTime',
"render": function ( data, type, full, meta ) {
var dataStr = Date.parse(data);
return new Date(dataStr).Format("yyyy-MM-dd hh:mm:ss");
}
},
{data:'id',
"render": function ( data, type, full, meta ) {
var edithtml ="<button class=\"btn btn-info\" type=\"button\" οnclick='editorActivity()'>编辑</button> "+
"<button class=\"btn btn-info\" type=\"button\" οnclick='deleteActivity()'>删除</button>"
return edithtml;
}
}
],
Date.prototype.Format = function (fmt) { //author: meizz
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
{
"resultList": [
{
"content": "元旦大促销活动",
"endTime": "2016-01-03T22:00:00",
"id": 1,
"startTime": "2016-01-01T08
:00:00",
"storeInfo": {
"buildingId": 3,
"buildingName": "一号楼",
"floorId": 4,
"floorName": "一层",
"id": 1,
"realName": "KFC",
"siteId": 2,
"siteName": "河西万达",
"storeId": 7,
"storeName": "Z1",
"zoneId": 1,
"zoneName": "万达企业"
}
},
{
"content": "手撕汉堡,新品上市,买一送一",
"endTime": "2015-12-30T14:43:38",
"id": 2,
"startTime": "2015-12-29T14:43:34",
"storeInfo": {
"buildingId": 3,
"buildingName": "一号楼",
"floorId": 4,
"floorName": "一层",
"id": 1,
"realName": "KFC",
"siteId": 2,
"siteName": "河西万达",
"storeId": 7,
"storeName": "Z1",
"zoneId": 1,
"zoneName": "万达企业"
}
},
{
"content": "麻麻黑,免费吃,只
要你能吃得完,随便吃",
"endTime": "2016-02-15T14:45:05",
"id": 3,
"startTime": "2016-02-01T14:44:53",
"storeInfo": {
"buildingId": 3,
"buildingName": "一号楼",
"floorId": 4,
"floorName": "一层",
"id": 1,
"realName": "KFC",
"siteId": 2,
"siteName": "
河西万达",
"storeId": 7,
"storeName": "Z1",
"zoneId": 1,
"zoneName": "万达企业"
}
}
]
}