如何对 HTML 表执行实时搜索和筛选

2022-08-30 03:02:18

我已经在谷歌上搜索和搜索Stack Overflow一段时间了,但我就是无法解决这个问题。

我有一个标准的HTML表格,比如说,包含水果。这样:

<table>
   <tr>
      <td>Apple</td>
      <td>Green</td>
   </tr>
   <tr>
      <td>Grapes</td>
      <td>Green</td>
   </tr>
   <tr>
      <td>Orange</td>
      <td>Orange</td>
   </tr>
</table>

在此之上,我有一个文本框,我想将其作为用户类型搜索表。因此,例如,如果他们键入,则表的橙色行将消失,留下苹果和葡萄。如果他们继续前进并打字,苹果行应该会消失,只留下葡萄。我希望这很清楚。GreGreen Gr

而且,如果用户从文本框中删除部分或全部查询,我希望现在与查询匹配的所有行都重新出现。

虽然我知道如何在jQuery中删除表行,但我对如何进行搜索并基于此有选择地删除行知之甚少。有没有一个简单的解决方案?还是一个插件?

如果有人能给我指出正确的方向,那将是辉煌的。

谢谢。


答案 1

我创建了这些示例。

简单索引搜索

var $rows = $('#table tr');
$('#search').keyup(function() {
    var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();

    $rows.show().filter(function() {
        var text = $(this).text().replace(/\s+/g, ' ').toLowerCase();
        return !~text.indexOf(val);
    }).hide();
});

演示http://jsfiddle.net/7BUmG/2/

正则表达式搜索

使用正则表达式的更高级功能将允许您以行中的任何顺序搜索单词。如果您键入 或 :,它将以相同的方式工作:apple greengreen apple

var $rows = $('#table tr');
$('#search').keyup(function() {

    var val = '^(?=.*\\b' + $.trim($(this).val()).split(/\s+/).join('\\b)(?=.*\\b') + ').*$',
        reg = RegExp(val, 'i'),
        text;

    $rows.show().filter(function() {
        text = $(this).text().replace(/\s+/g, ' ');
        return !reg.test(text);
    }).hide();
});

演示http://jsfiddle.net/dfsq/7BUmG/1133/

去抖动

在实现表筛选并搜索多个行和多列时,考虑性能和搜索速度/优化非常重要。简单地说你不应该在每一次击键上运行搜索功能,这是没有必要的。为了防止过滤运行得太频繁,你应该去掉它。上面的代码示例将变成:

$('#search').keyup(debounce(function() {
    var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();
    // etc...
}, 300));

你可以选择任何去抖动实现,例如从Lodash _.debounce,或者你可以使用一些非常简单的东西,就像我在下一个演示中使用的一样(从这里开始去抖动):http://jsfiddle.net/7BUmG/6230/http://jsfiddle.net/7BUmG/6231/


答案 2

以下是在HTML表格中搜索的最佳解决方案,同时覆盖所有表格(表格中的所有td,tr),纯javascript并尽可能

<input id='myInput' onkeyup='searchTable()' type='text'>

<table id='myTable'>
   <tr>
      <td>Apple</td>
      <td>Green</td>
   </tr>
   <tr>
      <td>Grapes</td>
      <td>Green</td>
   </tr>
   <tr>
      <td>Orange</td>
      <td>Orange</td>
   </tr>
</table>

<script>
function searchTable() {
    var input, filter, found, table, tr, td, i, j;
    input = document.getElementById("myInput");
    filter = input.value.toUpperCase();
    table = document.getElementById("myTable");
    tr = table.getElementsByTagName("tr");
    for (i = 0; i < tr.length; i++) {
        td = tr[i].getElementsByTagName("td");
        for (j = 0; j < td.length; j++) {
            if (td[j].innerHTML.toUpperCase().indexOf(filter) > -1) {
                found = true;
            }
        }
        if (found) {
            tr[i].style.display = "";
            found = false;
        } else {
            tr[i].style.display = "none";
        }
    }
}
</script>