【问题标题】:How can I add to my table filter to allow for multiple checkbox selections, as well as filtering from a dropdown?如何添加到我的表格过滤器以允许多个复选框选择,以及从下拉列表中过滤?
【发布时间】:2013-07-11 10:05:33
【问题描述】:

我有一个表格,可以通过多个复选框以及“选择”下拉菜单进行过滤。本质上,我想要做的是单击多个复选框以查找包含该类的每一行,因此类 1 和 3,或示例,然后按位置对其进行过滤。

此时我已经非常接近了,我可以从复选框中选择位置(这也是一个类,两个字母代表州缩写)和一个类,但我希望人们能够比较复选框中的多个类。

问题是我理解的,但似乎无法弄清楚如何解决。该代码将每个类添加到“tr”的末尾。这意味着如果您从复选框中应用 2 个过滤器,它什么也找不到,而不是从每个过滤器中找到所有内容。虽然此行为对于 1 个复选框和下拉菜单非常有用,这意味着它只会给我来自田纳西州的过滤器 1 值,我希望它能够同时给我过滤器 2、过滤器 3 和过滤器 4,如果我所以选择吧。

关于如何改变它以使其允许多个复选框选择的任何想法?

顺便说一句,我可以使用的 JavaScript/jQuery 插件非常有限,这就是为什么我非常努力地在这个解决方案中使用 tableSorter。

我的 HTML:

 <form name="FilterForm" id="FilterForm" action="" method="">
    <input type="checkbox" name="filterStatus" value="1" /><label for="filter_1">Filter 1</label>
    <input type="checkbox" name="filterStatus" value="2" /><label for="filter_2">Filter 2</label>
    <input type="checkbox" name="filterStatus" value="3" /><label for="filter_3">Filter 3</label>
    <input type="checkbox" name="filterStatus" value="4" /><label for="filter_4">Filter 4</label>
    <select type="dropdown" name="filterStatus" id="chooseState" class="filter">
      <option value="ZZ">--Choose State--</option>
      <option value="TN">Tennessee</option>
      <option value="MO">Missouri</option>
      <option value="NV">Nevada</option>
      <option value="IA">Iowa</option>
    </select><label>State</label>
       </form>

<table id="StatusTable">
     <tbody>                        
       <tr class="1 TN">
       <td class="Name"></td>
       <td class="ID"></td>
       <td class="Type"></td>
       <td class="Location">City, Tennessee</td>
       <td class="Class"></td>
       <td class="Received"></td>
       <td class="Action"></td>
       <td class="Status">Active</td>
     </tr>
</tbody>
</table>

JavaScript:

    $("input[name='filterStatus'], select.filter").change(function () {
var classes = "";
var stateClass = ""

    $("input[name='filterStatus']").each(function() {
    if ($(this).is(":checked")) {
    classes += "." + $(this).val();
    }
});

$("select.filter").each(function() {
if ($(this).val() != 'ZZ') {
stateClass += "." + $(this).val();
}
});

if (classes == "" && stateClass == "") {
// if no filters selected, show all items
$("#StatusTable tbody tr").show();
} else {
// otherwise, hide everything...
$("#StatusTable tbody tr").hide();

    // then show only the matching items
rows = $("#StatusTable tr" + classes + stateClass);
if (rows.size() > 0) {
rows.show();
}
}

});

【问题讨论】:

  • 你说问题出在复选框上,但我看不到你在代码中使用复选框的位置,你能用小提琴重现它吗? jsfiddle.net/ZRRnG
  • 我在最后一次尝试编辑时设法破坏了它。我已经编辑了我的问题以重新包含它。让我看看我能不能把它弄得一团糟。谢谢!

标签: javascript jquery forms filter html-table


【解决方案1】:

既然你知道问题所在,那我就跳过解释直接跳到解决方案。

.filter() 方法与数组混合使用。

不要扩展字符串,而是将类名放入数组中:

var classes = [];

$("input[name='filterStatus']").each(function() {
    if ($(this).is(":checked")) {
        classes.push('.'+$(this).val());
    }
});

然后在选择行时,就这样使用.filter()

rows = $("#StatusTable tr" + stateClass).filter(classes.length ? classes.join(',') : '*')

然后一切正常!

Fiddle

【讨论】:

  • 我现在正在审查它。谢谢你的建议,我会告诉你进展如何!
  • 它活着!非常感谢您抽出宝贵的时间,因为它使我免于将头撞到墙上。享受您一天的剩余时间,以及您的“答案!”状态。
  • 我偶然发现了答案的问题。如果你只选择一个状态,它什么也没有。关于如何解决这个问题的任何想法?我也在为此努力。
猜你喜欢
  • 1970-01-01
  • 2017-11-07
  • 2010-12-24
  • 2022-12-15
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多