搜尋

搜尋是 DataTables 的重要組成部分,其目標是使資料易於存取。因此,它內建了許多搜尋功能,並提供了自訂搜尋和 API 的選項,以允許進階和特定情況的搜尋操作。本文檔將詳細討論如何在 DataTables 中執行搜尋。

全域搜尋

您在使用 DataTables 時遇到的第一個搜尋控制項是表格右上角的預設全域搜尋。它使用 search 功能,其位置可以使用 layout 選項來控制。我們將其稱為「全域」搜尋,因為它將在所有欄中搜尋資料。DataTables 的內建 search 輸入預設啟用以下功能

  • 以任何順序搜尋單字(例如,Today Friday 將產生與 Friday Today 相同的資料集)。
  • 不區分大小寫的搜尋(例如,Banana 將產生與 BaNaNa 相同的結果)。
  • 使用雙引號搜尋確切的片語(例如,"Export Data")。
  • 使用單字前的驚嘆號進行負向搜尋匹配(例如,!Click 將找到所有包含「click」單字的資料)。

我們將以上稱為「智慧」搜尋,終端使用者通常會與之互動。它的設計與 Google 和 Kagi 等搜尋引擎類似,因此終端使用者可以立即熟悉 UI 中呈現的介面。

API

搜尋 API 是真正開始變得有趣的地方,因為您可以自訂搜尋選項並提供您自己的自訂搜尋函式。

全域搜尋 API 是 search(),如果僅給定一個字串,它會提供與全域搜尋輸入相同的功能

table
    .search('"New York" -Chief')
    .draw();

您也可以提供 DataTables.SearchOptions 物件來自訂上述搜尋選項和其他選項

table.search('Chief', {
    caseInsensitive: false
});

此外,您可以提供搜尋函式或正規表示式 - 這真正開啟了 DataTables 的搜尋能力,幾乎可以滿足您能想像的任何需求

table
    .search(d => d.includes('My search term'))
    .draw();

欄搜尋

到目前為止,我們已經討論了在整個表格中進行搜尋,但是,有時您可能希望僅對特定欄應用搜尋字詞。可以使用 column().search() 方法來完成。DataTables 預設不呈現欄搜尋輸入元素,但是可以很容易地添加它們,如此範例所示

column().search() 具有與上面討論的全域搜尋相同的所有選項。對於欄搜尋可能特別感興趣的一個附加選項是 DataTables.SearchOptionsexact 選項,如果您給終端使用者一個 select 選項,如此範例所示,這會很有用。

固定搜尋

search()column().search() 方法會立即應用給定的搜尋字詞,覆蓋先前應用的任何搜尋字詞。但是,有時您可能希望一次應用多個搜尋字詞,堆疊搜尋字詞以向終端使用者呈現複雜的搜尋控制項。可以使用「固定」搜尋來完成此操作,您可以為搜尋字詞提供唯一的名稱(或 ID),並且它將一直應用,直到被替換。我們將其稱為「固定搜尋」。

API 方法是 search.fixed()column().search.fixed()。它們的工作方式與上面討論的方法完全相同,但允許同時使用多個搜尋字詞。

例如,以下程式碼將建立一個名為「citySearch」的固定搜尋,除非被替換,否則它將保持不變。然後,終端使用者可以使用來自 searchinput,以提供他們自己的搜尋字詞,並附加到此字詞上

table.search.fixed('citySearch', 'Paris');

如果您正在開發可重複使用的 DataTables 外掛程式,則固定搜尋特別有用,因為它可以減少搜尋字詞衝突的可能性。

擴充功能

search 功能是 DataTables 預設內建的唯一搜尋輸入控制項。但是,我們也為 DataTables 生產了許多擴充功能,可提供更進階的搜尋輸入

  • SearchBuilder 讓終端使用者建立複雜的搜尋運算式
  • SearchPanes 顯示可用於搜尋主表格的資料清單。

可以很容易地建立其他外掛程式,例如此字母搜尋控制項。如果您為 DataTables 建立搜尋外掛程式,請告訴我們

舊版搜尋

在 DataTables 2 之前,必須使用 DataTable.ext.search 陣列將搜尋函式添加到 DataTables,該陣列包含函式清單。此方法有許多缺點,包括搜尋會應用於頁面上的所有表格,並且需要額外的邏輯才能將其限制為特定表格。

為了向後相容,DataTables 2 中保留了對 DataTable.ext.search 的支援,但是新專案不應使用此 API,舊專案應移植到新的 API。

以下資訊保留給使用 DataTables 1.x 的任何人。不要建立使用此 API 的新專案

DataTables 的舊版外掛程式搜尋函式應附加到 DataTable.ext.search 陣列。

輸入

該函式採用五個輸入參數

  1. object - DataTables 設定物件(請參閱 settings())。
  2. array - 列的搜尋資料陣列。陣列對於表格中的每一欄都有一個元素。
  3. integer - 所討論列的索引(請參閱 row().index())。
  4. objectarray - 列的原始資料來源。這將是作為列的資料來源提供給 DataTables 的陣列或物件。
  5. integer - 搜尋計數器。

請務必注意參數 2 和 4 之間的差異,因為它們可能相似並且可以攜帶相同的資料。作為第二個參數提供的 array 是列的搜尋資料,而第四個參數是列的原始資料物件。

傳回

外掛程式搜尋函式應傳回布林值

  • true - 該列應包含在搜尋結果中
  • false - 該列應從搜尋結果中移除

範例

以下範例顯示了從兩個輸入元素(#min#max)取得資料的範圍搜尋,終端使用者會在其中輸入數值資料以搜尋表格。執行一些邏輯運算(在本例中為數值範圍檢查),並傳回布林值。

DataTable.ext.search.push(
    function( settings, searchData, index, rowData, counter ) {
        var min = parseInt( $('#min').val(), 10 );
        var max = parseInt( $('#max').val(), 10 );
        var age = parseFloat( searchData[3] ) || 0; // using the data from the 4th column
 
        if ( ( isNaN( min ) && isNaN( max ) ) ||
             ( isNaN( min ) && age <= max ) ||
             ( min <= age   && isNaN( max ) ) ||
             ( min <= age   && age <= max ) )
        {
            return true;
        }
        return false;
    }
);

如果您有興趣,此範例示範了如何將上述程式碼移轉到 DataTables 2。