【问题标题】:Filtering Table rows using Jquery使用 Jquery 过滤表行
【发布时间】:2013-06-12 20:26:13
【问题描述】:

我找到了一个 Jquery 脚本,它根据输入字段执行表格过滤。该脚本基本上采用过滤器,拆分每个单词并使用每个单词过滤表行。所以最后你会得到一个行列表,其中包含输入字段中的所有单词。

http://www.marceble.com/2010/02/simple-jquery-table-row-filter/

var data = this.value.split(" ");

$.each(data, function(i, v){
     jo = jo.filter("*:contains('"+v+"')");
});

现在,我需要的是,而不是过滤包含输入字段中每个单词的行。我想过滤输入字段中至少包含一个单词的所有行。

我尝试过的一种方法是将每个过滤后的列表放入一个数组中......

  var rows = new Array();

 $.each(data, function(i, v){
     rows[i] = jo.filter("*:contains('"+v+"')");
 });

在这个阶段,我必须对“rows”数组中的所有行进行 UNION 并显示它们。我不知道该怎么做。

上面的脚本在行动 - http://marceble.com/2010/jqueryfilter/index.html?TB_iframe=true&width=720&height=540

如果我在过滤器中输入“cat 6”,我想显示三行。

【问题讨论】:

    标签: jquery


    【解决方案1】:

    看看这个jsfiddle

    这个想法是过滤带有循环单词的函数的行。

    jo.filter(function (i, v) {
        var $t = $(this);
        for (var d = 0; d < data.length; ++d) {
            if ($t.is(":contains('" + data[d] + "')")) {
                return true;
            }
        }
        return false;
    })
    //show the rows that match.
    .show();
    

    编辑:请注意,使用:contains() 选择器无法实现不区分大小写的过滤,但幸运的是有text() 函数,因此过滤器字符串应为大写,条件更改为if ($t.text().toUpperCase().indexOf(data[d]) &gt; -1)。看看这个jsfiddle

    【讨论】:

    • 我喜欢这个解决方案。非常全面,利用了jquery的filter()方法。
    • 很好的解决方案!谢谢
    • 这帮了我不少忙。我喜欢它的简单性,尽管它如此强大。 @nrodic 是真正的 MVP
    • 效果很好,但它匹配包含最新输入术语的任何行。有没有办法在第一个词的结果中搜索第二个词?
    • 这是一个很好的解决方案。你能做到不区分大小写吗?
    【解决方案2】:

    无需构建数组。您可以直接寻址 DOM。

    试试:

    rows.hide();
    $.each(data, function(i, v){
        rows.filter(":contains('" + v + "')").show();
    });
    

    DEMO

    编辑

    要发现符合条件的行而不立即显示它们,然后将它们传递给函数:

    $("#searchInput").keyup(function() {
        var rows = $("#fbody").find("tr").hide();
        var data = this.value.split(" ");
        var _rows = $();//an empty jQuery collection
        $.each(data, function(i, v) {
            _rows.add(rows.filter(":contains('" + v + "')");
        });
        myFunction(_rows);
    });
    

    UPDATED DEMO

    【讨论】:

    • 觉得我说得太早了。您的回答完全解决了我的问题,但我需要更多。当我找到匹配值时,我不想立即显示这些行。我需要列出所有这些行并将它们传递给另一个函数。
    • 过滤并删除过滤器后,没有给出结果,而应该显示所有结果
    • Dane 你是对的——我的演示没有解决这个问题。试试this update,其中一个空过滤器被作为一种特殊情况处理。
    • 简单干净。有什么办法让它不区分大小写?
    • @RickSmith 你有什么想法让这个大小写不敏感吗?想不通
    【解决方案3】:

    我选择了@nrodic 的答案(顺便说一句,谢谢),但它有几个缺点:

    1) 如果您有包含“cat”、“dog”、“mouse”、“cat dog”、“cat dog mouse”的行(每行都在单独的行上),那么当您明确搜索“cat dog mouse”时,您将显示“猫”、“狗”、“鼠标”、“猫狗”、“猫狗鼠标”行。

    2) .toLowerCase() 未实现,即输入小写字符串时,不显示匹配大写文本的行。

    所以我想出了@nrodic 代码的一个分支,其中

    var data = this.value; //plain text, not an array
    

    jo.filter(function (i, v) {
        var $t = $(this);
        var stringsFromRowNodes = $t.children("td:nth-child(n)")
        .text().toLowerCase();
        var searchText = data.toLowerCase();
        if (stringsFromRowNodes.contains(searchText)) {
            return true;
            }
        return false;
    })
    //show the rows that match.
    .show();
    

    完整代码如下:http://jsfiddle.net/jumasheff/081qyf3s/

    【讨论】:

    • 额外的好处,您的版本中的退格会恢复显示的所有值。
    • 只是给未来读者的注意事项:您可以轻松地将 $t.children() 选择器从 "td:nth-child(n)" 更改为像 "filter-criteria" 这样的类。然后将该类添加到每个 &lt;td&gt; 限制过滤器搜索的列。
    • stringsFromRowNodes.contains 需要更改为stringsFromRowNodes.includes。我对帖子中的代码进行了编辑以反映这一点。 (可能正在等待审核)我没有更改 JSFiddle
    【解决方案4】:

    基于@CanalDoMestre 的回答。我添加了对空白过滤器案例的支持,修复了一个错字并防止隐藏行,因此我仍然可以看到列标题。

        $("#filterby").on('keyup', function() {
            if (this.value.length < 1) {
                $("#list tr").css("display", "");
            } else {
                $("#list tbody tr:not(:contains('"+this.value+"'))").css("display", "none");
                $("#list tbody tr:contains('"+this.value+"')").css("display", "");
            }
        });
    

    【讨论】:

      【解决方案5】:

      我有一个非常简单的功能:

      function busca(busca){
          $("#listagem tr:not(contains('"+busca+"'))").css("display", "none");
          $("#listagem tr:contains('"+busca+"')").css("display", "");
      }
      

      【讨论】:

        【解决方案6】:

        tr:not(:contains(....为我工作

        function busca(busca){
            $("#listagem tr:not(:contains('"+busca+"'))").css("display", "none");
            $("#listagem tr:contains('"+busca+"')").css("display", "");
        }
        

        【讨论】:

          【解决方案7】:

          nrodic 有一个惊人的答案,我只是想提供一个小更新,让您知道通过一个小的额外功能,您可以扩展 contains 方法以区分大小写:

          $.expr[":"].contains = $.expr.createPseudo(function(arg) {
              return function( elem ) {
                  return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
              };
          });
          

          【讨论】:

            【解决方案8】:

            添加另一种方法:

            value = $(this).val().toLowerCase();
            $("#product-search-result tr").filter(function () {
            $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
            });
            

            【讨论】:

              【解决方案9】:

              我使用了 Beetroot-Betroot 的解决方案,但我没有使用 contains,而是使用 containsNC,这使得它不区分大小写。

              $.extend($.expr[":"], {
              "containsNC": function(elem, i, match, array) {
              return (elem.textContent || elem.innerText ||
              "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
              }
              });
              

              【讨论】:

                猜你喜欢
                • 2011-12-18
                • 2016-09-29
                • 2018-03-17
                • 1970-01-01
                • 2018-08-20
                • 1970-01-01
                相关资源
                最近更新 更多