关于此问题,这里已经有关于SO的几个问题,但是与我的具体情况无关。
我有一个包含两列的数据表,一列包含文本输入字段,另一列包含选择内容。数据表搜索功能的当前行为是在整个选定的HTML中搜索。我想要的行为是仅搜索所选的选项。
我知道我们可以覆盖/拦截搜索/过滤器事件,即
$('#mapping-table_filter input', data_table.table().container())
.off('.DT')
.on('keyup.DT cut.DT paste.DT input.DT search.DT', function (e) {
data_table.search(...).draw();
});
// or
data_table.on('search.dt', function () {
});
但这没有帮助,因为.search
不接受回调。
JSFiddle https://jsfiddle.net/0oabx2mr/
如果搜索“第一”,“第二”或“第三”中的任何一个,则两行仍然可见。我希望能够搜索“第二”和“第三”,并且只获取相关行。
答案 0 :(得分:2)
在架构上稍作更改,您的示例可能如下所示:
var srcData = [
['firstOption', 'secondOption', 'thirdOption'],
['firstOption', 'secondOption', 'thirdOption'],
['firstOption', 'secondOption', 'thirdOption'],
['firstOption', 'secondOption', 'thirdOption']
];
var dataTable = $('#mytable').DataTable({
sDom: 't',
data: srcData,
columns: [{
title: 'Options',
render: (data, type, row) => '<select>'+row.reduce((options, option) => options += `<option value="${option}">${option}</option>`,'')+'</select>'
}]
});
var needle = null;
$.fn.DataTable.ext.search.push(
(settings, row, index) => $(dataTable.cell(`:eq(${index})`,':eq(0)').node()).find('select').val().match(needle) || !needle
);
$('#search').on('keyup', event => {
needle = $(event.target).val();
dataTable.draw();
});
<!doctype html>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css">
</head>
<body>
<input id="search"></input>
<table id="mytable"></table>
</body>
</html>