jQuery DataTables ' или ' поиск / фильтр
Я использую jQuery DataTables (http://www.datatables.net/) для отображения некоторых табличных данных. Поиск/ фильтр-это мощная функция. Хотя при поиске нескольких ключевых слов в таблице поиск фильтрует только уже отфильтрованные данные.
например, в Примере здесь -http://jsfiddle.net/illuminatus/2j0Lz5or/1/
Если ключевые слова ищутся как 10 99
Это не дает никакого результата. Я хочу, чтобы поиск отображался все результаты / строки, содержащие все ключевые слова, которые ищутся или вводятся.
Поиск 10 99
отобразит строки 1, 5 и 6.
технически поиск должен быть поиском "или".
был бы признателен за любую помощь.
изменить: Поиск должен быть поиском "или".
4 ответов
и-фильтр (включает строки, в которых присутствуют все слова поиска). Это настраиваемый фильтр переопределяет встроенный процесс фильтрации. Каждый столбец в каждой строке сравнивается с искомым словом.
$.fn.dataTableExt.afnFiltering.push(
function(oSettings, aData, iDataIndex) {
var keywords = $(".dataTables_filter input").val().split(' ');
var matches = 0;
for (var k=0; k<keywords.length; k++) {
var keyword = keywords[k];
for (var col=0; col<aData.length; col++) {
if (aData[col].indexOf(keyword)>-1) {
matches++;
break;
}
}
}
return matches == keywords.length;
}
);
раздвоенная скрипка -> http://jsfiddle.net/9d097s4a/
или-фильтр (включает строки, в которых присутствует хотя бы одно из слов поиска). Это другой подход, в основном, попытка streamline ответ выше. Вместо того, чтобы играть с oSearch
и жестко закодированные условия поиска, событие фильтрации по умолчанию заменяется событием, которое маркирует поисковую фразу, а затем выполняет расширенный fnFilter()
. В качестве дополнительного эксперимента поиск теперь выполняется только при нажатии пользователем enter - это как-то более естественно.
var input = $(".dataTables_filter input");
input.unbind('keyup search input').bind('keypress', function (e) {
if (e.which == 13) {
var keywords = input.val().split(' '), filter ='';
for (var i=0; i<keywords.length; i++) {
filter = (filter!=='') ? filter+'|'+keywords[i] : keywords[i];
}
dataTable.fnFilter(filter, null, true, false, true, true);
// ^ Treat as regular expression or not
}
});
см демо -> http://jsfiddle.net/2p8sa9ww/
Я получил эту работу с помощью regEx search. Я использовал следующее регулярное выражение для поиска по всей таблице ключевых слов 10 99
^(?=.*?(10|99)).*?
раздвоенная скрипка -http://jsfiddle.net/illuminatus/2j0Lz5or/6/
Ref: http://datatables.net/forums/discussion/12062/filtering-jquery-datatable-using-regular-expression
обновлено для Datatables 1.10
/ / поле поиска в новом местоположении
Table = $('#your_datatable').DataTable();
$('#your_input_text_field').keyup(function () {
Table.search($(this).val()).draw();
})
////OR search (enabling regular expression search)
var input = $('#your_input_text_field');
input.unbind('keyup search input').bind('keypress', function (e) {
if (e.which == 13) {
var keywords = input.val().split(' '),
filter = '';
for (var i = 0; i < keywords.length; i++) {
filter = (filter !== '') ? filter + '|' + keywords[i] : keywords[i];
}
//true (param 2) turns regex on, false (param 3) turns smart search off
Table.search(filter, true, false).draw();
}
});
тот же, но запускающий поиск на "каждом" нажатии клавиши вместо нажатия enter:
var dataTable = $('table').dataTable();
var input = $(".dataTables_filter input");
input.unbind('keyup search input').bind('keyup',
function(e) {
if (input.val().length > 0) {
var keywords = input.val().trim().split(' '), filter = '';
for (var i = 0; i < keywords.length; i++) {
filter = (filter !== '') ? filter + '|' + keywords[i] : keywords[i];
}
dataTable.fnFilter(filter, null, true, false, true, true);
// ^ Treat as regular expression or not
} else if (input.val().length == 0) {
dataTable.fnFilter(" ", null, true, false, true, true);
}
});
<script
src="https://code.jquery.com/jquery-3.2.1.slim.min.js"
integrity="sha256-k2WSCIexGzOj3Euiig+TlR8gA0EmPjuc79OEeY5L45g="
crossorigin="anonymous"></script>
<link rel="stylesheet" type="text/css" href="//cdn.datatables.net/1.10.6/css/jquery.dataTables.css">
<script type="text/javascript" language="javascript" src="//cdn.datatables.net/1.10.6/js/jquery.dataTables.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.datatables.net/responsive/1.0.6/css/dataTables.responsive.css">
<script type="text/javascript" language="javascript" src="//cdn.datatables.net/responsive/1.0.6/js/dataTables.responsive.js"></script>
<h5>OR SEARCH</h5>
<table>
<thead>
<tr>
<th>A</th>
<th>B</th>
<th>C</th>
<th>D</th>
</tr>
</thead>
<tbody>
<tr><td>0</td><td>0</td><td>0</td><td>10</td></tr>
<tr><td>0</td><td>5</td><td>0</td><td>0</td></tr>
<tr><td>0</td><td>0</td><td>0</td><td>0</td></tr>
<tr><td>2</td><td>0</td><td>0</td><td>10</td></tr>
<tr><td>0</td><td>0</td><td>9</td><td>10</td></tr>
<tr><td>0</td><td>0</td><td>99</td><td>0</td></tr>
</tbody>
</table>
var dataTable = $('#your_datatable').dataTable();
var input = $(".dataTables_filter input");
input.unbind('keyup search input').bind('keyup',
function(e) {
if (input.val().length > 0) {
var keywords = input.val().trim().split(' '), filter = '';
for (var i = 0; i < keywords.length; i++) {
filter = (filter !== '') ? filter + '|' + keywords[i] : keywords[i];
}
dataTable.fnFilter(filter, null, true, false, true, true);
// ^ Treat as regular expression or not
} else if (input.val().length == 0) {
dataTable.fnFilter(" ", null, true, false, true, true);
}
});