0

我有这段代码可以通过Footable进行选择字段过滤器。它有效,但它比需要的结果更紧张。示例:“国家期刊中的文章”选项正在过滤具有“国家期刊中的文章”和“国际期刊中的文章”的行。我怎样才能使它更精确?谢谢你。

jQuery(function () {
    jQuery('#projectos').footable().bind('footable_filtering', function (e) {
      var selected = jQuery('.filter-status').find(':selected').text();
      if (selected && selected.length > 0) {
        e.filter += (e.filter && e.filter.length > 0) ? ' ' + selected : selected;
        e.clear = !e.filter;
      }
    });

    jQuery('.clear-filter').click(function (e) {
      e.preventDefault();
      jQuery('.filter-status').val('');
      jQuery('#projectos').trigger('footable_clear_filter');
    });

    jQuery('.filter-status').change(function (e) {
      e.preventDefault();
      jQuery('#projectos').trigger('footable_filter', {filter: jQuery('#filter').val()});
    });
  });
4

1 回答 1

3

当 Footable 过滤时,它使用整行中的整个文本并使用 indexof() 进行测试。您可以在 filterFunction 函数的 footable.filter.js 中看到这一点。

我必须做 3 件事来解决这个问题。

  1. 用我自己的函数替换 window.footable.options.filter.filterFunction
  2. 进行每列匹配而不是整行。根据行中的 HTML,列之间的空格可能会丢失,从而导致列的第一个单词与前一列的最后一个单词连接。
  3. 使用正则表达式匹配而不是 indexof()。这使您可以匹配整个单词。例如,如果您在“不要作恶,因为那不好”中将 indexof() 用于“be”,将返回 6 和 15,即使 15 是一个完全不同的单词的开头。

这是功能:(我确信有很多改进。随意编辑......)

window.footable.options.filter.filterFunction = function(index) {
        var $t = $(this),
          $table = $t.parents('table:first'),
          filter = $table.data('current-filter').toUpperCase(),
          columns = $t.find('td');

        var regEx = new RegExp("\\b" + filter + "\\b");
        var result = false;
        for (i = 0; i < columns.length; i++) {
          var text = $(columns[i]).text();
          result = regEx.test(text.toUpperCase());
          if (result === true)
            break;

          if (!$table.data('filter-text-only')) {
             text = $(columns[i]).data("value");
             if (text)
               result = regEx.test(text.toString().toUpperCase());
          }

          if (result === true)
            break;
        }

        return result;
      };

你可以在这里找到一个 plunk:http: //plnkr.co/edit/P2DWDtyHP3xmoUIcvgDe

于 2014-06-16T23:11:21.807 回答