搜尋
搜尋是 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.SearchOptions
的 exact
選項,如果您給終端使用者一個 select
選項,如此範例所示,這會很有用。
固定搜尋
search()
和 column().search()
方法會立即應用給定的搜尋字詞,覆蓋先前應用的任何搜尋字詞。但是,有時您可能希望一次應用多個搜尋字詞,堆疊搜尋字詞以向終端使用者呈現複雜的搜尋控制項。可以使用「固定」搜尋來完成此操作,您可以為搜尋字詞提供唯一的名稱(或 ID),並且它將一直應用,直到被替換。我們將其稱為「固定搜尋」。
API 方法是 search.fixed()
和 column().search.fixed()
。它們的工作方式與上面討論的方法完全相同,但允許同時使用多個搜尋字詞。
例如,以下程式碼將建立一個名為「citySearch」的固定搜尋,除非被替換,否則它將保持不變。然後,終端使用者可以使用來自 search
的 input
,以提供他們自己的搜尋字詞,並附加到此字詞上
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
陣列。
輸入
該函式採用五個輸入參數
object
- DataTables 設定物件(請參閱settings()
)。array
- 列的搜尋資料陣列。陣列對於表格中的每一欄都有一個元素。integer
- 所討論列的索引(請參閱row().index()
)。object
或array
- 列的原始資料來源。這將是作為列的資料來源提供給 DataTables 的陣列或物件。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。