jquery 的datatables插件問題


 
翻頁后js失效;

重繪事件-當表格重繪完成后
重新綁定事件: draw.dt
$('#example').dataTable();
 
$('#example').on( 'draw.dt', function () {
    console.log( 'Redraw occurred at: '+new Date().getTime() );
} );

  





(多列排序)
//按第二列降序排序,

出現提示: Datables wrning(table id='example'):Cannot reinitialise DataTable. To retrieve the
Datables object for this table,please pass eithser no arguments to the dataTable() function,

解決方法:

1、加 "bDestroy":true,和"bRetrieve": true, 只是能屏蔽提示。 2、 $(document).ready(function () { $('#Todolisttable').dataTable().fnDestroy(); //必須加fnDestroy() 這個.將這個表格先銷毀,然后在重新生成。 $('#Todolisttable').dataTable({ "aaSorting": [ [1, "desc"] //按第二列降序排序, ] }); });
2、 $(document).ready(function () {
            $('#Todolisttable').dataTable().fnDestroy(); 
            $('#Todolisttable').dataTable({
                "aaSorting": [
                    [1, "desc"] 
          ] }); });

 

用了DataTables做為展示數據的表格。該控件支持分頁,而且又漂亮。這是官網的地址http://www.datatables.net/ 。本文記錄我在工作中用到DataTables的相關功能及實現。

 

在采用這個控件之前,服務端向網頁返回數據,頁面用javascipt將數據拼接成html的表格,代碼中充斥着很多 += '<td>' '<tr>' '<a>'。而且還要處理分頁,每個頁碼還要自己綁定一個拼接的url請求,代碼不僅長,而且頁面的展示效果不好功能也不夠強大。

 

 

采用了這個控件展示數據后,javascript的代碼減少了70-80行。它要求服務端要按照它規定的數據格式返回數據,接着會幫我們自動處理分頁和數據的展示,就不用我們手動拼接字符串構造table表的元素了。

 

先看代碼:

 

[javascript]  view plain copy
 
  1. function generate_table() {  
  2.     g_table = $('#historyResult').dataTable({  
  3.         "oLanguage": {  
  4.             "sLengthMenu": "每頁 _MENU_ 條數據",  
  5.             "sZeroRecords": "沒有數據",  
  6.             "sInfo": "_START_ - _END_ 總(_TOTAL_)",  
  7.             "sInfoEmpty": "0 - 0 總數: 0"  
  8.         },  
  9.         "sPaginationType": "full_numbers",  
  10.         "bProcessing": true,  
  11.         "bServerSide": true,  
  12.         "bSort":false,  
  13.         "bFilter": false,  
  14.         "sAjaxSource": "/index.php/history/queryHistory",  
  15.   
  16.         "fnServerParams": function( aoData )  
  17.         {  
  18.             aoData.push(  
  19.                     {"name":"keywords","value":$('#keyword_txt').val(),  
  20.                     {"name":"start_date","value":$('#start_date_txt').val()},  
  21.                     {"name":"end_date","value":$('#end_date_txt').val()}  
  22.                 )  
  23.         }  
  24.     });  
  25. }  

 

 

具體的參數意思可以參考官方文檔。這里提一下fnServerParams。這個參數可以幫我們傳遞頁面的其他參數,這個例子中,我傳遞了關鍵字、起止日期信息,主要用於服務端的數據查找過濾。

 

用chrome看一下控件會向服務端傳遞什么:

 

 

這是底部的分頁欄

 

 

當我點第二頁時,傳遞參數如下:

 

注意到iDisplayLength是10,因為我默認是每頁展示10條數據,這個值可以調整。當我點第二頁時,iDisplayStart從0變到10。其實分頁就是這么回事,前端告訴服務端,我需要那段數據,你給我找出來返回給我。

 

服務端的返回格式如下(PHP):

[php]  view plain copy
 
  1. $ret = array(  
  2.                 "sEcho" => intval($_GET['sEcho']),  
  3.                 "iTotalRecords" => $data_count,  
  4.                 "iTotalDisplayRecords" => $data_count,  
  5.                 "aaData" => array()  
  6.             );  

 

$data_count是總數據量。aaData是需要展示的數據,之后可以填充。代碼如下

[php]  view plain copy
 
  1. $ret['aaData'][] = array($id, $user, $action, $business, $files, $time, $result);  

 

這是填充一條數據的PHP代碼,注意變量的前后位置很重要,這決定了表格中展示數據的位置。如果想在表格中嵌套<a>標簽,這也是可以的。在服務端將數據拼接成a標簽返回即可。

 

填充完后就返回數據:

[php]  view plain copy
 
  1. echo json_encode($ret);  

 

 

我所維護的頁面有一個功能,就是能根據日期和關鍵字查找記錄。當我們點擊表格中的下一頁時,它會自動的向服務端發起一次數據請求。然而,怎么讓用戶點擊一個按鈕時,也發起一次數據請求呢?

 

我的辦法是:將這個表格先銷毀,然后在重新生成。代碼如下:

 

[javascript]  view plain copy
 
  1. $("#search").click(function(){        
  2.         g_table.fnDestroy();  
  3.         generate_table();  
  4.   });  

 

 

重新生成表格會默認第一頁,而每次搜索都是根據不同的關鍵字和日期的,所以跳到第一頁是合理的。如果不用fnDestroy(),試圖直接覆蓋g_table重新生成,這是不允許的。

 

至此,實現了基於DataTables的數據查找及分頁。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM