jQuery DataTables - фильтровать столбец по точному соответствию
Попытка отобразить только точные соответствия поисковому запросу, введенному в строке поиска.
Например, у меня есть панель поиска, которая фильтрует по ID#. Я хочу отображать только те записи, которые соответствуют точному # введенному значению.
Так что если 123
введен, я не хочу 12345
, 91239
и т. д. и т. д. для отображения. Только 123
,
Видел некоторую информацию о bRegex
на странице часто задаваемых вопросов, но это не работает для меня. Есть идеи?
10 ответов
Ок решил проблему. Однако, поскольку столбец, в котором я использую точное совпадение, иногда содержит несколько идентификаторов, разделенных запятыми, я не смогу использовать поиск точного соответствия.
Но для тех, кто заинтересован, вот ответ:
oTable.fnFilter( "^"+TERM+"$", COLUMN , true); //Term, Column #, RegExp Filter
Это даст вам точный результат для столбца.
table.column(i)
.search("^" + $(this).val() + "$", true, false, true)
.draw();
то есть поиск ( input, regex, smart, caseInsen)
$(document).ready( function() {
$('#example').dataTable( {
"oSearch": {"bSmart": false}
} );
} )
Попробуйте использовать опцию bSmart и установите для нее значение false
Из документации
"Когда"bSmart" DataTables будет использовать свои интеллектуальные методы фильтрации (для сопоставления слов в любой точке данных), при значении false это не будет сделано".
ОБНОВИТЬ
Я нашел это:
oSettings.aoPreSearchCols[ iCol ].sSearch = "^\\s*"+'1'+"\\s*$";
oSettings.aoPreSearchCols[ iCol ].bRegex = false;
oSettings.aoPreSearchCols[ iCol ].bSmart= false;
по этой ссылке http://www.datatables.net/forums/discussion/4096/filtering-an-exact-match/p1
Похоже, вы можете установить bSmart
а также bRegex
на столбец, а также указание регулярного выражения для столбца.
Вы можете использовать регулярное выражение для точного соответствия следующим образом:
var table = $('#dt').DataTable();
$('#column3_search').on('keyup', function () {
// Note: column() accepts zero-based index meaning the index of first column is 0, second column is 1 and so on.
// We use `2` here as we are accessing 3rd column whose index is 2.
table.column(2)
.search("^" + this.value + "$", true, false, true)
.draw();
});
Синтаксис search
функция:
поиск (input, regex, smart_search, case_insensitive)
Мы отключаем умный поиск в этом случае, потому что search
Функция использует регулярное выражение внутри себя, когда умный поиск установлен в значение true. В противном случае это создает конфликт между нашим регулярным выражением и тем, которое используется search
функция.
Для получения дополнительной информации ознакомьтесь со следующей документацией из DataTable:
Надеюсь, это полезно!
Если вы хотите точное совпадение с самого начала, вы можете попробовать этот код,
var table = $('#myTable').DataTable()
$('#filterrow > th:nth-child(2) > input').on( 'keyup change', function () {
table
.column( $(this).parent().index()+':visible' )
.search( "^" + this.value, true, false, true )
.draw();
} );
Просто установите регулярное выражение и умное ложное. и вы получите точный результат.
$('#yourTableID').DataTable({
search: {
regex: false,
smart: false
}
})
Текущие версии Datatables поддерживают использование реального точного сопоставления на основе столбцов.
table.column(i)
.search($(this).val(), false, false, false)
.draw();
Документация объясняет каждый флаг.
$(document).ready(function() {
tbl = $('#example').dataTable();
tbl.fnFilter("^" + filter_value + "$");
});
куда filter_value
строка, введенная в поле фильтра
Regex не был для меня удобным решением, так как требовал много исключений в коде. Итак, моим решением было добавить в jquery.datatable.min.js новый параметр «точное значение» со значением по умолчанию false (чтобы избежать проблем с совместимостью)
[...]
p.columns.push({data:n,name:u.sName,searchable:u.bSearchable,exactvalue:u.bExactvalue,orderable:u.bSortable,
[...]
d.bFilter&&(m("sSearch_"+l,sa.sSearch),m("bRegex_"+l,sa.bRegex),m("bSearchable_"+l,u.bSearchable),m("bExactvalue_"+l,u.bExactvalue));
[...]
q.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bExactvalue:null,bSortable:null,bVisible:null
[...]
q.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bExactvalue:false,bSortable:!0,
[...]
Этот новый вариант будет отправлен вместе с другими данными в сообщении:
[...]
columns[5][searchable]: true
columns[5][exactvalue]: true
columns[5][orderable]: true
[...]
После этого измените класс php ssp, чтобы он принял новое значение. Измените функцию фильтра в ssp, изменив:
if ( $requestColumn['searchable'] == 'true' ) {
if ( $requestColumn['exactvalue'] == 'true' ) {
$binding = self::bind( $bindings, $str, PDO::PARAM_STR );
$columnSearch[] = ($isJoin) ? $column['db']." = ".$binding : "`".$column['db']."` = ".$binding;
}else{
$binding = self::bind( $bindings, '%'.$str.'%', PDO::PARAM_STR );
$globalSearch[] = ($isJoin) ? $column['db']." LIKE ".$binding : "`".$column['db']."` LIKE ".$binding;
}
}
и повторите для фильтрации отдельных столбцов
if ( $requestColumn['searchable'] == 'true' && $str != '' ) {
if ( $requestColumn['exactvalue'] == 'true' ) {
$binding = self::bind( $bindings, $str, PDO::PARAM_STR );
$columnSearch[] = ($isJoin) ? $column['db']." = ".$binding : "`".$column['db']."` = ".$binding;
}else{
$binding = self::bind( $bindings, '%'.$str.'%', PDO::PARAM_STR );
$columnSearch[] = ($isJoin) ? $column['db']." LIKE ".$binding : "`".$column['db']."` LIKE ".$binding;
}
}
Теперь в определении вашей таблицы columnDefs просто добавьте
{'targets': 5, 'exactvalue': true}
и ваш столбец будет отфильтрован с точным значением.
table.column(col_num).search(filter_value + "$", true, true, false).draw();