使用Jquery过滤表行

时间:2013-06-12 20:26:14

标签: jquery

我找到了一个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+"')");
 });

在这个阶段,我必须在“行”数组中创建所有行的UNION并显示它们。我迷失了如何做到这一点。

以上脚本 - http://marceble.com/2010/jqueryfilter/index.html?TB_iframe=true&width=720&height=540

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

9 个答案:

答案 0 :(得分:81)

看看这个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()函数,因此过滤字符串应为大写,条件更改为{{1} }。看看这个jsfiddle

答案 1 :(得分:26)

无需构建阵列。您可以直接处理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

答案 2 :(得分:4)

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

1)如果您的行包含“cat”,“dog”,“mouse”,“cat dog”,“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/

答案 3 :(得分:3)

基于@ 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", "");
        }
    });

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

再添加一种方法:

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

nrodic有一个惊人的答案,我只是想给你一个小小的更新,让你知道通过一个额外的小函数,你可以扩展contains methid以区分大小写:

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

答案 8 :(得分:0)

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

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