5

假设我有一个标准的 HTML 表格结构,例如:

<table class="table table-striped table-hover table-bordered table-condensed">
<thead>
    <tr>
        <th>Name</th>
        <th>Type</th>
        <th>Added</th>
    </tr>
</thead>
<tbody>
    <tr id="1a0daa2734" class="item">
        <td><a href="/view/1a0daa2734">Item Number 1</a></td>
        <td>A</td>
        <td>8/1/2012 10:18:34 PM</td>
    </tr>
    <tr id="b1ff6e0ac" class="item">
        <td><a href="/view/b1ff6e0ac">Item Number 2</a></td>
        <td>B</td>
        <td>8/2/2012 5:48:54 PM</td>
    </tr>
    <tr id="edd8b70893" class="item">
        <td><a href="/view/edd8b70893">Item Number 3</a></td>
        <td>A</td>
        <td>8/13/2012 3:55:41 PM</td>
    </tr>
</tbody>
</table>

我正在尝试使用 jQuery 编写客户端搜索。基本上我有一个 id 的搜索框search-items

    $("#search-items").bind("keyup paste", function() {
        var searchText = $("#search-items").val(); 

        $(".item").each(function() {
             //???
        });
    });

获取搜索值并在 tbody 内部search-items找到NON-MATCHES的最佳方法是什么?我想要不匹配的,因为这些是我要隐藏的元素。

它应该只在前两个td元素内搜索,所以nameandtype列,不添加

谢谢。

4

3 回答 3

7

以下代码将在您将值键入到 column1 或 2 时尝试将它们匹配。

$("#search").on("keyup paste", function() {
    var value = $(this).val().toUpperCase();
    var $rows = $("table tr");

    if(value === ''){
        $rows.show();
        return false;
    }

    $rows.each(function(index) {
        if (index !== 0) {

            $row = $(this);

            var column1 = $row.find("td:first a").html().toUpperCase();
            var column2 = $row.find("td").eq(1).text().toUpperCase();

            if ((column1.indexOf(value) > -1) || (column2.indexOf(value) > -1)) {
                $row.show();
            }
            else {
                $row.hide();
            }
        }
    });
});​

演示- 分别按第 1 列和第 2 列值搜索您的表(未添加)

我确信有一种更有效的编写方式,但这应该可以帮助您入门。

于 2012-09-15T01:45:54.667 回答
3

这样的事情怎么样?

function escapeRegex(value) {
    return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
}

$(function() {
    $("#search-items").bind("keyup paste", function() {
        var searchText = $("#search-items").val(),
            regex = new RegExp(escapeRegex(searchText), "gi"),
            $items = $(".item").show();

        if (searchText) {
            $items.each(function() {
                var $tds = $("td", this).slice(0, 2), // only the first two columns
                    text = $tds.text();

                if (text.search(regex) === -1) {
                    $(this).hide();
                }

            });
        }
    });
});​

示例:http: //jsfiddle.net/Pc7Nk/1/

escapeRegex功能是从jQueryUI自动完成的源代码中无耻地窃取的。

于 2012-09-15T02:09:15.323 回答
-1

逐行查找第一个 td (如果愿意,您还可以添加 n 个要匹配的 td 元素。.text() 将返回一个字符串,使用字符串对象 .search 方法,您将返回索引在第一次匹配时,如果没有匹配则返回 -1,因此我们隐藏该行。

$("#search-items").bind("keyup paste", function() {
    var searchText = $("#search-items").val(); 

    $(".item").each(function() {
         var $this = $(this)
         if ($this.find('td:first-child').text().search(searchText) === -1) {
             $this.hide()
         }
    });
});
于 2012-09-15T01:45:42.767 回答