dataTables对表格数据处理非常方便,但是有时将大量数据直接加载到前端页面就会造成页面访问十分不流畅,所以可以考虑使用异步加载数据。
这个在官网也有详细的说明:戳这
dataTables AJAX请求后端数据非常简单,只要在初始化时设置 serverSide: true 即开启后端处理数据。
如下是初始化dataTables的代码:
1 var dataTables = $("#table_id").dataTable({ 2 processing: true, 3 serverSide: true, //开启后端模式 4 ajax : { 5 //请求数据的URL 6 url:'http://localhost:802/datatables/ajax.php?XDEBUG_SESSION=PHPSTORM', 7 //后端返回中哪个字段是数据 8 dataSrc: "data", 9 //你也可以自己指定返回的数据中的字段 10 // dataFilter: function(data){ 11 // var json = jQuery.parseJSON( data ); 12 // json.recordsTotal = json.total; 13 // json.recordsFiltered = json.total; 14 // json.data = json.list; 15 // return JSON.stringify(json); 16 // } 17 }, 18 //告诉datatables数据中对应的列 19 columns: [ 20 { "data": "name" }, 21 { "data": "num" } 22 ], 23 paging: true,//开启分页 24 ordering: true,//开启排序 25 searching: true,//开启搜索 26 iDisplayLength : 50,//默认长度 27 language: lang //语言 这里我把提出来了,在最下面完整代码 28 });
现在你的前端表格只要有数据请求就会向你的URL发出请求,下图是后端接收的请求参数:
后端根据前端的要求去数据库中得到数据,这里要注意的是你不能完全相信前端传来的值,比如用户在搜索中输入一条SQL语句到后端,然后你直接把用户搜索的值合成一条SQL去执行,这样就会产生意想不到的事情。
好了,你从数据库中得到值后整理成对应的JSON数据输出到前端。dataTables就会根据JSON数据更新表格,如下是返回的JSON:
{ "data": [ { "name": "Bob", "num": "16" }, { "name": "Tom", "num": "46" } ], "status": true, "recordsTotal": 100000, "recordsFiltered": 100000 }
recordsTotal是数据的总条数,recordsFiltered是数据过滤后的条数,data是实际的返回数据。如果你的JSON字段需要改变在初始化时将你的设置传入构造函数即可。
条件搜索
当然有时候你需要根据一些条件来搜索,比如搜索一个时间范围或者一个什么用户输入的条件。
你只需要将要搜索的值传入并触发搜索就可以了。
例如下面代码是点击了按钮后,将用户要搜索的值传到后端。
1 $('#submit').on('click',function () { //当id为submit的按钮被点击了
//取到两个输入框中的值 2 var min = $('#minValue').val(); 3 var max = $('#maxValue').val();
//合成后传入到后端 4 dataTables.api().search(min+'-'+max).draw(); 5 });
延时搜索
一般这样dataTables简单的AJAX请求就完成了,但是要注意的是这样的方法前端每次改变都会触发后端查询数据库,会增加后端服务器的压力。
你也可以在初始化时设置:searchDelay: 400 这个意思是每次用户在搜索框中输入后延时400ms后再去请求后端从而降低服务器压力,默认即为400ms。
例子
下面是完整的初始化部分代码:
1 var lang = { 2 lengthMenu: '<select class="form-control">' + 3 '<option value="50">50</option>' + 4 '<option value="100">100</option>' + 5 '<option value="300">300</option>' + 6 '<option value="500">500</option>' + 7 '<option value="800">800</option>' + 8 '<option value="1000">1000</option>' + 9 '</select>', 10 search: '<span>表格搜索:</span>', 11 "oPaginate": { 12 "sFirst": "首页", 13 "sPrevious": "上页", 14 "sNext": "下页", 15 "sLast": "末页" 16 }, 17 zeroRecords: "<span>没有内容</span>", 18 info: "<span>总共_PAGES_ 页,显示第_START_ 到第 _END_ ,筛选之后得到 _TOTAL_ 条,初始_MAX_ 条 </span>", 19 infoEmpty: "<span>0条记录</span>", 20 }; 21 22 $(function () { 23 var dataTables = $("#table_id").dataTable({ 24 processing: true, 25 serverSide: true, //开启后端模式 26 ajax : { 27 //请求数据的URL 28 url:'http://localhost:802/datatables/ajax.php?XDEBUG_SESSION=PHPSTORM', 29 //后端返回中哪个字段是数据 30 dataSrc: "data", 31 //你也可以自己指定返回的数据中字段的名 32 // dataFilter: function(data){ 33 // var json = jQuery.parseJSON( data ); 34 // json.recordsTotal = json.total; 35 // json.recordsFiltered = json.total; 36 // json.data = json.list; 37 // return JSON.stringify(json); 38 // } 39 }, 40 //告诉datatables数据中对应的列 41 columns: [ 42 { "data": "name" }, 43 { "data": "num" } 44 ], 45 paging: true,//开启分页 46 ordering: true,//开启排序 47 searching: true,//开启搜索 48 iDisplayLength : 50,//默认长度 49 language: lang //语言 50 }); 51 52 53 $('#submit').on('click',function () { 54 var min = $('#minValue').val(); 55 var max = $('#maxValue').val(); 56 dataTables.api().search(min+'-'+max).draw(); 57 }); 58 59 });