如何使用 jQuery DataTables 外掛處理 DataTable 的特定事件?


DataTables 是一個強大的 jQuery 外掛,它使開發人員能夠在 Web 應用程式中建立功能豐富且互動式的資料表格。憑藉其廣泛的選項和功能集,DataTables 為顯示和操作表格資料提供了靈活且可自定義的解決方案。

增強使用者體驗和為 DataTables 新增功能的一個關鍵方面是處理外掛觸發的特定事件。DataTables 提供了各種各樣的事件,允許開發人員響應使用者互動,根據表格更改執行操作,並根據其需求自定義行為。

基本事件處理 - 事件註冊和回撥函式

要處理 DataTable 事件,我們需要註冊事件處理程式並提供回撥函式,這些函式將在觸發相應的事件時執行。DataTables 提供了多種事件註冊方法,使開發人員可以根據其需求靈活地選擇最合適的方法。

使用 On() 方法

DataTables 中的 on() 方法允許我們為特定的 DataTable 事件註冊事件處理程式。它提供了一種方便的方式將回調函式繫結到事件,並在事件委託和動態事件處理中提供靈活性。

示例

以下是如何使用 on() 方法為 draw.dt 事件註冊事件處理程式的示例:

<!DOCTYPE html>
<html>
<head>
   <title>DataTables Event Handling Example</title>
   <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.25/css/jquery.dataTables.min.css">
</head>
<body>
   <table id="myTable" class="display" style="width:100%">
      <thead>
         <tr>
            <th>Name</th>
            <th>Position</th>
            <th>Office</th>
            <th>Age</th>
            <th>Start date</th>
            <th>Salary</th>
         </tr>
      </thead>
      <tbody>
         <tr>
            <td>Tiger Nixon</td>
            <td>System Architect</td>
            <td>Edinburgh</td>
            <td>61</td>
            <td>2011/04/25</td>
            <td>$320,800</td>
         </tr>
         <tr>
            <td>Garrett Winters</td>
            <td>Accountant</td>
            <td>Tokyo</td>
            <td>63</td>
            <td>2011/07/25</td>
            <td>$170,750</td>
         </tr>
         <!-- More rows... -->
      </tbody>
   </table>
   <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
   <script src="https://cdn.datatables.net/1.10.25/js/jquery.dataTables.min.js"></script>
   <script>
      $(document).ready(function() {
         $('#myTable').DataTable().on('draw.dt', function() {
            console.log('Table redrawn!');
         });
      });
   </script>
</body>
</html>

在此示例中,我們選擇具有 myTable ID 的 DataTable,並使用 on() 方法為 draw.dt 事件註冊回撥函式。每當表格重新繪製時,回撥函式將被執行,並將訊息“表格重新繪製!”記錄到控制檯。

使用帶有事件名稱空間的 On() 方法

事件名稱空間提供了一種組織和管理同一事件的多個事件處理程式的方法。透過使用名稱空間,我們可以為特定事件註冊多個事件處理程式,並輕鬆地單獨刪除或管理它們。

示例

以下是如何使用 on() 方法使用事件名稱空間的示例:

<!DOCTYPE html>
<html>
<head>
   <title>DataTables Event Handling Example</title>
   <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.25/css/jquery.dataTables.min.css">
</head>
<body>
   <table id="myTable" class="display" style="width:100%">
      <thead>
         <tr>
            <th>Name</th>
            <th>Position</th>
            <th>Office</th>
            <th>Age</th>
            <th>Start date</th>
            <th>Salary</th>
         </tr>
      </thead>
      <tbody>
         <tr>
            <td>Tiger Nixon</td>
            <td>System Architect</td>
            <td>Edinburgh</td>
            <td>61</td>
            <td>2011/04/25</td>
            <td>$320,800</td>
         </tr>
         <tr>
            <td>Garrett Winters</td>
            <td>Accountant</td>
            <td>Tokyo</td>
            <td>63</td>
            <td>2011/07/25</td>
            <td>$170,750</td>
         </tr>
         <!-- More rows... -->
      </tbody>
   </table>
   <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
   <script src="https://cdn.datatables.net/1.10.25/js/jquery.dataTables.min.js"></script>
   <script>
      $(document).ready(function() {
         $('#myTable').DataTable().on(    'draw.customEvent', function() {
            console.log('Custom event triggered!');
         });
   
         // Trigger the custom event
         $('#myTable').DataTable().trigger('draw.customEvent');
      });
   </script>
</body>
</html>

在此示例中,我們為 draw 事件註冊了兩個事件處理程式,每個處理程式都有一個不同的名稱空間。透過在註冊事件處理程式時指定名稱空間,我們可以輕鬆地管理和刪除它們(如果需要)。

使用 Event() 方法

DataTables 中的 event() 方法提供了一種直接的方式來繫結 DataTable 事件的事件處理程式。它是一種簡寫方法,在內部呼叫 on() 方法並簡化事件註冊。

示例

以下是如何使用 event() 方法為 draw.dt 事件註冊事件處理程式的示例:

<!DOCTYPE html>
<html>
<head>
   <title>DataTables Event Handling Example</title>
   <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.25/css/jquery.dataTables.min.css">
</head>
<body>
   <table id="myTable" class="display" style="width:100%">
      <thead>
         <tr>
            <th>Name</th>
            <th>Position</th>
            <th>Office</th>
            <th>Age</th>
            <th>Start date</th>
            <th>Salary</th>
         </tr>
      </thead>
      <tbody>
         <tr>
            <td>Tiger Nixon</td>
            <td>System Architect</td>
            <td>Edinburgh</td>
            <td>61</td>
            <td>2011/04/25</td>
            <td>$320,800</td>
         </tr>
         <tr>
            <td>Garrett Winters</td>
            <td>Accountant</td>
            <td>Tokyo</td>
            <td>63</td>
            <td>2011/07/25</td>
            <td>$170,750</td>
         </tr>
         <!-- More rows... -->
      </tbody>
   </table>   
   <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
   <script src="https://cdn.datatables.net/1.10.25/js/jquery.dataTables.min.js"></script>
   <script>
      $(document).ready(function() {
         $('#myTable').DataTable().event('draw.dt', function() {
            console.log('Draw event triggered!');
         });
   
         // Trigger the draw event
         $('#myTable').DataTable().draw();
      });
   </script>
</body>
</html>

在此示例中,我們使用 event() 方法為 draw 事件註冊回撥函式。其行為類似於使用 on() 方法,但語法更簡潔。

透過利用這些事件註冊方法,我們可以輕鬆地繫結事件處理程式並響應特定的 DataTable 事件。

高階事件處理

事件委託

事件委託是 jQuery DataTables 中的一種技術,它允許您處理動態新增的元素或頁面載入時 DOM 中不存在的元素上的事件。您無需將事件處理程式直接附加到目標元素,而是將其附加到載入時存在的父元素。這樣,即使目標元素稍後新增,當事件冒泡到父元素時也會捕獲它。

要使用 jQuery DataTables 實現事件委託,您可以使用 on() 方法以及事件委託語法。通用語法如下:

$(document).on('event', 'selector', handler);

以下是如何使用事件委託處理 DataTable 中動態新增的按鈕上的 click 事件的示例:

示例

<!DOCTYPE html>
<html>
<head>
   <title>Event Delegation Example</title>
   <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
   <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.11.3/css/jquery.dataTables.min.css">
   <script src="https://cdn.datatables.net/1.11.3/js/jquery.dataTables.min.js"></script>
</head>
<body>
   <table id="myTable" class="display">
      <thead>
         <tr>
            <th>Name</th>
            <th>Action</th>
         </tr>
      </thead>
      <tbody>
         <tr>
            <td>John Doe</td>
            <td><button class="btn-delete">Delete</button></td>
         </tr>
      </tbody>
   </table>
   <script>
      $(document).on('click', '#myTable .btn-delete', function() {
         var data = $(this).closest('tr').find('td:first').text();
         console.log('Delete button clicked for:', data);
      });
   
      $(document).ready(function() {
         $('#myTable').DataTable();
      });
   </script>
</body>
</html>

在此示例中,click 事件被委託到 document 元素,但只有當 #myTable 元素內的 .btn-delete 按鈕被點選時,事件處理程式才會執行。這允許您處理動態生成的按鈕或初始頁面載入後新增的按鈕的事件。

自定義事件觸發器

除了處理內建事件外,jQuery DataTables 還允許您建立和觸發自定義事件。當您想要建立自定義功能或在應用程式的不同部分之間進行通訊時,自定義事件非常有用。

要建立自定義事件,您可以使用 jQuery 提供的 trigger() 方法。trigger() 方法允許您手動觸發 DataTable 例項上的指定事件。

示例

以下是如何建立和觸發自定義事件的示例:

<!DOCTYPE html>
<html>
<head>
   <title>Custom Event Example</title>
   <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
   <script src="https://cdn.datatables.net/1.10.25/js/jquery.dataTables.min.js"></script>
   <script>
      $(document).ready(function() {
         // Create a custom event
         var customEvent = $.Event('customEvent');
   
         // Trigger the custom event on a DataTable instance
         $('#myTable').DataTable().trigger(customEvent);
   
         // Register a handler for the custom event
         $('#myTable').on('customEvent', function() {
         console.log('Custom event triggered!');
         });
      });
   </script>
</head>
<body>
   <table id="myTable">
      <thead>
         <tr>
            <th>Name</th>
            <th>Age</th>
         </tr>
      </thead>
      <tbody>
         <tr>
            <td>John</td>
            <td>25</td>
         </tr>
         <tr>
            <td>Jane</td>
            <td>30</td>
         </tr>
      </tbody>
   </table>
</body>
</html>

在此示例中,我們使用 $.Event() 函式建立了一個名為 customEvent 的自定義事件。然後,我們使用 trigger() 方法在 DataTable 例項上觸發自定義事件。最後,我們使用 on() 方法為自定義事件註冊處理程式,並在觸發事件時記錄一條訊息。

常見的 DataTable 事件和用例

排序事件

jQuery DataTable 外掛提供了幾個與排序相關的事件,您可以使用這些事件來自定義排序行為並執行其他操作:

order.dt: Triggered when the sorting order is changed.
$('#myTable').on('order.dt', function (e, settings) {
   // Code to handle sorting order change
});
preInit.dt: Triggered just before the DataTable is initialized.
$('#myTable').on('preInit.dt', function (e, settings) {
   // Code to modify initial sorting order programmatically
});
preDraw.dt: Triggered before the DataTable is redrawn due to sorting.
$('#myTable').on('preDraw.dt', function (e, settings) {
   // Code to perform pre-processing tasks or modifications
});
draw.dt: Triggered after the DataTable is redrawn due to sorting.
$('#myTable').on('draw.dt', function (e, settings) {
   // Code to perform actions after the table has been updated
});

過濾事件

jQuery DataTable 外掛提供了與過濾相關的事件,允許您自定義過濾行為並執行其他操作:

search.dt: Triggered when the search term is changed or the table is filtered.
$('#myTable').on('search.dt', function (e, settings) {
   // Code to handle search term change or filtering
});
preXhr.dt: Triggered before an Ajax request is made for server-side processing.
$('#myTable').on('preXhr.dt', function (e, settings, data) {
   // Code to modify the data sent to the server
});
xhr.dt: Triggered when an Ajax request is completed for server-side processing.
$('#myTable').on('xhr.dt', function (e, settings, json) {
   // Code to handle the server response
});
preFilter.dt: Triggered before the table is filtered.
$('#myTable').on('preFilter.dt', function (e, settings) {
   // Code to perform pre-processing tasks or modifications
});
filter.dt: Triggered after the table is filtered.
$('#myTable').on('filter.dt', function (e, settings) {
   // Code to perform actions after the table has been filtered
});

分頁事件

jQuery DataTable 外掛提供了與分頁相關的事件,允許您自定義分頁行為並執行其他操作:

page.dt: Triggered when the table page is changed.
$('#myTable').on('page.dt', function (e, settings) {
   // Code to handle page change event
});
length.dt: Triggered when the number of rows per page is changed.
$('#myTable').on('length.dt', function (e, settings, len) {
   // Code to handle row length change event
});
preXhr.dt: Triggered before an Ajax request is made for server-side processing.
$('#myTable').on('preXhr.dt', function (e, settings, data) {
   // Code to modify the data sent to the server
});
xhr.dt: Triggered when an Ajax request is completed for server-side processing.
$('#myTable').on('xhr.dt', function (e, settings, json) {
   // Code to handle the server response
});
draw.dt: Triggered after the table is redrawn, which includes pagination updates.
$('#myTable').on('draw.dt', function (e, settings) {
   // Code to perform actions after the table is redrawn
});

結論

通過了解並有效地使用這些事件處理技術,您可以建立滿足您特定需求的動態和互動式表格。請務必仔細考慮事件型別,選擇合適的事件處理方法,並利用可用的事件資料來操作和控制您的 DataTables。

更新於: 2023年8月7日

744 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告