根据多个复选框筛选表行

时间:2013-11-13 20:43:14

标签: jquery jquery-filter

我是一个jQuery新手。

我有这个表需要根据包含不同类别值的复选框进行过滤。这是我一直在努力的代码

<input class="prod_status" type="checkbox" value="Discontinued">Discontinued<br/>
<input class="prod_status" type="checkbox" value="Shipping">Shipping<br/>
<input class="prod_capacity" type="checkbox" value="1GB">1GB<br/>
<input class="prod_capacity" type="checkbox" value="2GB">2GB<br/>
<input class="prod_capacity" type="checkbox" value="4GB">4GB<br/>
<input class="prod_speed" type="checkbox" value="1000MHz">1000MHz<br/>
<input class="prod_speed" type="checkbox" value="1333MHz">1333MHz<br/>
<br /><br />

<table class="someclass" border="0" cellpadding="0" cellspacing="0" summary="bla">
<caption>bla bla</caption>
<thead>
    <tr id="ProductID">
    <th>Product Number</th>
    <th>Status</th>
    <th>Capacity</th>
    <th>Speed</th>
    </tr>
</thead>
<tbody>
    <tr id="Memory1" class="part_detail">
    <td class="name">Memory1</td>
    <td class="status">Shipping</td>
    <td class="capacity">1GB</td>
    <td class="speed">1333MHz</td>
    </tr>
    <tr id="Memory2" class="part_detail">
    <td class="name">Memory2</td>
    <td class="status">Discontinued</td>
    <td class="capacity">2GB</td>
    <td class="speed">1000MHz</td>
    </tr>
    <tr id="Memory3" class="part_detail">
    <td class="name">Memory3</td>
    <td class="status">Shipping</td>
    <td class="capacity">2GB</td>
    <td class="speed">1333MHz</td>
    </tr>
    <tr id="Memory4" class="part_detail">
    <td class="name">Memory4</td>
    <td class="status">Discontinued</td>
    <td class="capacity">4GB</td>
    <td class="speed">1000MHz</td>
    </tr>
    <tr id="Memory5" class="part_detail">
    <td class="name">Memory5</td>
    <td class="status">Shipping</td>
    <td class="capacity">4GB</td>
    <td class="speed">1333MHz</td>
    </tr>
</tbody>
</table>

var oData = $("tbody tr.part_detail");
$(":checkbox.prod_status").change(function() {
    var checkedValues = $(":checkbox.prod_status:checked").map(function() {
    return this.value;
}).get();

    if (checkedValues.length > 0) {
        oData.hide();
        for (var i = 0; i < checkedValues.length; i++) {
            oData.filter(function() {
                if (checkedValues[i].toString() == $(this).find('.status').text()) 
                    $(this).show();
            });
        }
    }
    else
        $("tbody tr.part_detail").show();
});

我只是设法让它与状态类别一起使用。我之后基本上卡住了。我有一种感觉,我让事情变得比它们应该更复杂,但我的jQuery经验还不足以让它变得更好。

我试着总结一下这个要求:

  • 如果未选中复选框,则将显示所有行
  • 如果选中某个类别中的一个或多个复选框,则会显示与该类别中所选值匹配的所有记录。
  • 如果选中其他类别中的一个或多个复选框,则仅显示与所有类别匹配的记录。

换句话说,逻辑AND应用于不同类别,而逻辑OR应用于类别。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

看到这个小提琴http://jsfiddle.net/abhiklpm/ZEDR9/5/

我通过添加“rel”属性和一些“class”来修改您的HTML,以便轻松访问数据:

$("input:checkbox").click(function () {
    var showAll = true;
    $('tr').not('.first').hide();
    $('input[type=checkbox]').each(function () {
        if ($(this)[0].checked) {
            showAll = false;
            var status = $(this).attr('rel');
            var value = $(this).val();            
            $('td.' + status + '[rel="' + value + '"]').parent('tr').show();
        }
    });
    if(showAll){
        $('tr').show();
    }
});

编辑:我在那个小提琴中犯了一个错误,

更改:

<td class="capacity" rel="Shipping">2GB</td>

来: <td class="capacity" rel="2GB">2GB</td>

否则在2Gb时它只会显示1个结果。