javascript - 基于复选框和 div id 和类的多个过滤器

标签 javascript jquery html checkbox

这个想法是通过比较动态生成的 div 类和动态生成的复选框 id 来过滤 div,其中只有类与选中的复选框 id 匹配的 div 才会显示。

第一个子导航过滤一切正常。然而,subnav2 没有做任何事情。

简化的 html

<div class="itemswrap">
  <div class="inditem dynamic1 dynamic12"></div>
  <div class="inditem dynamic2 dynamic22"></div>
  <div class="inditem dynamic3 dynamic32"></div>
  <div class="inditem dynamic2 dynamic42"></div>
</div>


<ul class="subnav">
  <li class="lifilter">
    <input type="checkbox" class="filtercheck" id="dynamic1" />
    <label for="dynamic1">whatever label</label>
  </li>
  <li class="lifilter">
    <input type="checkbox" class="filtercheck" id="dynamic2" />
    <label for="dynamic1">whatever label</label>
  </li>
  <li class="lifilter">
    <input type="checkbox" class="filtercheck" id="dynamic3" />
    <label for="dynamic1">whatever label</label>
  </li>
</ul> 

<ul class="subnav2">
  <li class="lifilter2">
    <input type="checkbox" class="filtercheck2" id="dynamic12" />
    <label for="dynamic12">whatever label</label>
  </li>
  <li class="lifilter2">
    <input type="checkbox" class="filtercheck2" id="dynamic22" />
    <label for="dynamic12">whatever label</label>
  </li>
  <li class="lifilter2">
    <input type="checkbox2" class="filtercheck2" id="dynamic32" />
    <label for="dynamic12">whatever label</label>
  </li>
</ul>

还有我到目前为止得到的js。

  var $filters = $('.filtercheck').change(function() {
  var $items = $('.inditem').hide();
  var filters = $filters.filter(':checked').map(function() {
    return '.' + this.id;
  }).get();
  if (filters.length) {
    $items.filter(filters.join()).show();
  } else {
    $items.show();
  }
});

  var $filtersb = $('.filtercheck2').change(function() {
  var $itemsb = $('.inditem').hide();
  var filtersb = $filtersb.filter(':checked').map(function() {
    return '.' + this.id;
  }).get();
  if (filtersb.length) {
    $itemsb.filter(filters.join()).show();
  } else {
    $itemsb.show();
  }
});

最佳答案

我看到你修复了它,但我创建了一个 jsfiddle对于你的问题,类似于我在另一个项目中必须面对的问题。基本上,您可以根据选中的复选框 ID 创建一个字符串,并使用它来仅显示与您选中的元素匹配的项目。如果没有检查任何元素,则显示所有项目(即不应用过滤器)。

$("input[type='checkbox']").change(function()
{
    var list = "";

    $("input[type='checkbox']").each(function()
    {
        if(this.checked)
        {
            list = list + '.' + $(this).attr('id');
        }
    });

    if(list !=='')
    {
        $("div.inditem").hide();
        $(list).show();
    }
    else {
        $("div.inditem").show();
    }
});

关于javascript - 基于复选框和 div id 和类的多个过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28684224/

相关文章:

javascript - Node.js 中的原型(prototype)有什么用?

javascript - 输入格式

jquery - 如何随时间显示和隐藏 div 并单击隐藏选项?

javascript - 用js填充另一个域的iframe字段

javascript - _.bind 期间 lodash.js 中可能存在内存泄漏

javascript - 如何将带有序数后缀的数字转换为javascript中的数字

jQuery - 禁用基于选项关键字而不是值的选择选项

javascript - 显式初始化 Jquery Mobile?

javascript - 如何使用node js在html文件中传递变量以发送邮件

javascript - CSS 交付优化 : How to defer css loading?