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();

Другие вопросы по тегам