您可以使用DataTables提供的以下插件:
Diacritics Neutralize
这可以包含在您的 HTML 页面中,如下所示:
https://cdn.datatables.net/plug-ins/1.10.21/filtering/type-based/diacritics-neutralise.js
但是,要有效地使用此插件来满足您的需求,还需要一些额外的步骤,以便用户实际上看不到数据更改。
概述
-
在您的数据表中添加一个隐藏但可搜索的额外列。此列将包含表中其他列中所有文本的“规范化”版本(如下所述)。如果它的规范化形式与原始的非规范化形式不同,您只需要在此列中存储一个单词。
-
添加自定义搜索功能,对用户输入的搜索词执行相同的规范化过程。
这意味着用户可以对 i 或 I 或 İ 进行任何搜索 - 并且它将成功找到包含这些字符中的任何一个的任何行。
这里的关键部分是我们对表数据和搜索数据应用完全相同的规范化过程。
处理表格数据
如果您可以完全控制要在表中显示的数据,则可以在将数据发送到数据表之前执行步骤 (1)。您只需要将列定义为隐藏:
"columnDefs": [
{
"targets": [ -1 ], // -1 refers to the final column in the table
"visible": false,
"searchable": true
}
]
这要求您具有与我们将使用的“变音符号中和”功能提供的等效的服务器端功能。如果这不是一个选项,您可能更喜欢使用函数来处理表本身中的数据:
"columnDefs": [
{
"targets": [ -1 ], // -1 refers to the final column in the table
"visible": false,
"searchable": true,
"data": function ( row, type, val, meta ) {
return normalizeTableData( row ); // see below!
}
}
]
处理搜索词
为了规范化搜索词,我们可以使用以下DataTables搜索功能:
$('#example_filter input').off().keyup(function () {
var normString = normalizeString( this.value ); // see below!
table.search(normString).draw();
});
这假设我们的 HTML 表格的 ID 为“example”。
执行标准化
函数使用如下:
var normString = jQuery.fn.DataTable.ext.type.search.string(inputString);
如果您查看此函数的 JavaScript,您会发现它包含许多映射 - 例如:
{'base':'I', 'letters':/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g}
I 的土耳其语大写字母是 İ,其 Unicode 值为 u0130。您可以看到这被列为在提供的映射中映射到 I 的字符之一。
所以,我们的normalizeString 函数很简单:
function normalizeString(inputString) {
return jQuery.fn.DataTable.ext.type.search.string(inputString);
}
对于表数据,处理取决于数据是作为对象{...}还是数组[...]提供的。我将假设数组 - 但对象的迭代当然会有所不同:
function normalizeTableData( row ) {
var normalizedData = '';
row.forEach(function (item) {
var new = normalizeString( item );
if ( new !== item ) {
normalizedData = normalizedData + ' ' + new;
}
});
return normalizedData;
}
您可能需要增强上述迭代,具体取决于表中的数据类型(例如,无法规范化的数字数据值)。