即時 DOM 排序

這個範例示範如何使用 DOM 中可用的資訊來排序欄位。通常 DataTables 會在其初始化階段讀取要排序的資訊,並且不會根據使用者互動進行更新,因此對包含表單元素的欄位進行排序可能無法反映輸入的目前值。要克服這個問題,您必須在排序之前更新 DataTables 將排序的資料。此方法比實際使用 DOM 進行排序效率更高,因為每個要排序的儲存格只需要一個 DOM 查詢。

下面的範例顯示第一欄為普通文字,排序方式如您所預期的。後續欄位都有不同種類的表單輸入元素,而 DataTables 將根據排序時的值對其中包含的資訊執行排序。

這是一個相當簡單的範例,但您不限於僅使用表單輸入元素,您可以使用任何東西並自訂您的 DOM 查詢以適合自己。您也可以透過使用呼叫 order()draw() 方法的事件處理程式,在使用者在表單中輸入資料時即時更新排序。

姓名 年齡 職位 辦公室
Tiger Nixon
Garrett Winters
Ashton Cox
Cedric Kelly
Airi Satou
Brielle Williamson
Herrod Chandler
Rhona Davidson
Colleen Hurst
Sonya Frost
Jena Gaines
Quinn Flynn
Charde Marshall
Haley Kennedy
Tatyana Fitzpatrick
Michael Silva
Paul Byrd
Gloria Little
Bradley Greer
Dai Rios
Jenette Caldwell
Yuri Berry
Caesar Vance
Doris Wilder
Angelica Ramos
Gavin Joyce
Jennifer Chang
Brenden Wagner
Fiona Green
Shou Itou
Michelle House
Suki Burks
Prescott Bartlett
Gavin Cortez
Martena Mccray
Unity Butler
Howard Hatfield
Hope Fuentes
Vivian Harrell
Timothy Mooney
Jackson Bradshaw
Olivia Liang
Bruno Nash
Sakura Yamamoto
Thor Walton
Finn Camacho
Serge Baldwin
Zenaida Frank
Zorita Serrano
Jennifer Acosta
Cara Stevens
Hermione Butler
Lael Greer
Jonas Alexander
Shad Decker
Michael Bruce
Donna Snider
姓名 年齡 職位 辦公室
  • Javascript
  • HTML
  • CSS
  • Ajax
  • 伺服器端腳本
  • 註解

下面顯示的 Javascript 用於初始化此範例中顯示的表格

// 建立一個陣列,包含欄位中所有輸入框的值 DataTable.ext.order['dom-text'] = function (settings, col) { return this.api() .column(col, { order: 'index' }) .nodes() .map(function (td, i) { return $('input', td).val(); }); }; // 建立一個陣列,包含欄位中所有輸入框的值,並解析為數字 DataTable.ext.order['dom-text-numeric'] = function (settings, col) { return this.api() .column(col, { order: 'index' }) .nodes() .map(function (td, i) { return $('input', td).val() * 1; }); }; // 建立一個陣列,包含欄位中所有選擇選項的值 DataTable.ext.order['dom-select'] = function (settings, col) { return this.api() .column(col, { order: 'index' }) .nodes() .map(function (td, i) { return $('select', td).val(); }); }; // 建立一個陣列,包含欄位中所有核取方塊的值 DataTable.ext.order['dom-checkbox'] = function (settings, col) { return this.api() .column(col, { order: 'index' }) .nodes() .map(function (td, i) { return $('input', td).prop('checked') ? '1' : '0'; }); }; // 使用所需的欄位排序資料類型初始化表格 $('#example').DataTable({ columns: [ null, { orderDataType: 'dom-text-numeric' }, { orderDataType: 'dom-text', type: 'string' }, { orderDataType: 'dom-select' } ] });
// 建立一個陣列,包含欄位中所有輸入框的值 DataTable.ext.order['dom-text'] = function (settings, col) { return this.api() .column(col, { order: 'index' }) .nodes() .map(function (td, i) { let el = td.querySelector('input'); return el ? el.value : 0; }); }; // 建立一個陣列,包含欄位中所有輸入框的值,並解析為數字 DataTable.ext.order['dom-text-numeric'] = function (settings, col) { return this.api() .column(col, { order: 'index' }) .nodes() .map(function (td, i) { let el = td.querySelector('input'); return el ? el.value * 1 : 0; }); }; // 建立一個陣列,包含欄位中所有選擇選項的值 DataTable.ext.order['dom-select'] = function (settings, col) { return this.api() .column(col, { order: 'index' }) .nodes() .map(function (td, i) { let el = td.querySelector('select'); return el ? el.value : 0; }); }; // 建立一個陣列,包含欄位中所有核取方塊的值 DataTable.ext.order['dom-checkbox'] = function (settings, col) { return this.api() .column(col, { order: 'index' }) .nodes() .map(function (td, i) { let el = td.querySelector('input'); return el ? (el.checked ? 1 : 0) : 0; }); }; // 使用所需的欄位排序資料類型初始化表格 new DataTable('#example', { columns: [ null, { orderDataType: 'dom-text-numeric' }, { orderDataType: 'dom-text', type: 'string' }, { orderDataType: 'dom-select' } ] });

除了上述程式碼之外,還會載入以下 Javascript 函式庫檔案供此範例中使用

    下面顯示的 HTML 是原始 HTML 表格元素,在 DataTables 增強之前

    此範例使用了一些額外的 CSS,超出從函式庫檔案載入的 CSS (如下所示),以便正確顯示表格。下面顯示所使用的其他 CSS

    此範例中載入以下 CSS 函式庫檔案,以提供表格的樣式

      此表格透過 Ajax 載入資料。下面顯示已載入的最新資料。當載入任何其他資料時,此資料將會自動更新。

      下面顯示用於執行此表格伺服器端處理的腳本。請注意,這只是一個使用 PHP 的範例腳本。伺服器端處理腳本可以使用任何語言編寫,使用 DataTables 文件中描述的協定

      其他範例