【问题标题】:Filter div by checkbox按复选框过滤 div
【发布时间】:2018-01-17 20:18:44
【问题描述】:

我有一个复选框。我需要通过选择它们进行过滤。

<div class="filter">
    <div class="checkbox">
        <label><input type="checkbox" rel="canada"/>Canada</label>
    </div>
    <div class="checkbox">
        <label><input type="checkbox" rel="china"/>China</label>
    </div>
    <div class="checkbox">
        <label><input type="checkbox" rel="usa"/>USA</label>
    </div>
    <div class="checkbox">
        <label><input type="checkbox" rel="india"/>India</label>
    </div>
</div>

在应该被过滤的div下面

<div class="result">
    <div class="canada">
         <h1>Canada</h1>
         <h2>Jason</h2>
    </div>
    <div class="china">
         <h1>China</h1>
         <h2>Ni</h2>
    </div>
    <div class="usa">
         <h1>USA</h1>
         <h2>Micheal</h2>
    </div>
    <div class="india">
         <h1>India</h1>
         <h2>Alan</h2>
    </div>
</div>

在我的脚本下方。但我不能接受复选框的值。我应该怎么做。除了很多if,还有其他方法吗?

 <script>
        var choose = document.getElementsByClassName('chechbox');
        const div = document.getElementsByClassName('result');
        if (choose.value){
            result.style.display = "block";
        }
    </script>

请帮我写剧本

【问题讨论】:

  • 这样说吧,根据我的理解,您想根据复选框点击显示 div,对吧?
  • 您还尝试获取名为“chechbox”的类名,但您的 HTML 显示为“复选框”,您应该在继续之前更改该错字。

标签: javascript html checkbox


【解决方案1】:

choosediv 都是元素列表,而不是单个元素。你需要迭代它们。

    var checkboxes = document.getElementsByClassName('checkbox'); 
    Array.from( checkboxes ).forEach( function( checkBox ){
       ///rest of the code
    })

演示

var checkboxes = document.querySelectorAll('[type="checkbox"]');

var fnDisplayDivs = () => {
  Array.from(checkboxes).forEach(function(checkBox) {
    var div = document.querySelector("." + checkBox.getAttribute("rel"));
    if (checkBox.checked) {
      div.style.display = "block";
    } else {
      div.style.display = "none";
    }
  })
};

Array.from(checkboxes).forEach(function(checkBox) {
   checkBox.addEventListener( "change", function(){
      fnDisplayDivs();
   })
});
fnDisplayDivs();
<div class="filter">
  <div class="checkbox">
    <label><input type="checkbox" rel="canada"/>Canada</label>
  </div>
  <div class="checkbox">
    <label><input type="checkbox" rel="china"/>China</label>
  </div>
  <div class="checkbox">
    <label><input type="checkbox" rel="usa"/>USA</label>
  </div>
  <div class="checkbox">
    <label><input type="checkbox" rel="india"/>India</label>
  </div>
</div>

<div class="result">
  <div class="canada">
    <h1>Canada</h1>
    <h2>Jason</h2>
  </div>
  <div class="china">
    <h1>China</h1>
    <h2>Ni</h2>
  </div>
  <div class="usa">
    <h1>USA</h1>
    <h2>Micheal</h2>
  </div>
  <div class="india">
    <h1>India</h1>
    <h2>Alan</h2>
  </div>
</div>

【讨论】:

  • 第一个变量中的错字,将 'chechbox' 更改为 'checkbox' :D
  • @MihaiAlexandru-Ionut 我添加了一个演示。
  • @gurvinder372,无论如何,+1 为你的答案。
  • @MihaiAlexandru-Ionut 同样感谢。
  • 非常感谢。抱歉,我还有一个问题。我可以添加更多过滤器吗?例如
    ...
【解决方案2】:

getElementsByName() 方法返回文档中具有指定名称(name 属性的值)的所有元素的集合,作为NodeList 对象。

NodeList 对象代表 节点collection节点 可以通过index 数字访问。索引从 0 开始。

所以你必须使用 element` 索引才能访问它。例如,

if (choose[0].value){
        result.style.display = "block";
}

我想你想根据checkbox 值显示 div。此外,您必须将change 事件处理程序绑定到您的复选框。

function change(){
    var checkboxes = document.getElementsByClassName('checkbox');
    var chekboxInputs = Array.from(checkboxes).map(a => a.querySelector('input'));
    var allAreUnselected = chekboxInputs.every(function(elem){
       return !elem.checked;
    });
    if(allAreUnselected){
       chekboxInputs.forEach(function(input){
          Array.from(document.querySelectorAll("." + input.getAttribute("rel"))).forEach(function(item){
              item.style.display = 'block';
          });
       });
    }
    else {
      chekboxInputs.forEach(function(input){
          Array.from(document.querySelectorAll("." + input.getAttribute("rel"))).forEach(function(item){
            item.style.display = input.checked ? 'block' : 'none';
          });
       });
    }
}
change();
<div class="filter">
    <div class="checkbox">
        <label><input type="checkbox" rel="canada" onchange="change()"/>Canada</label>
    </div>
    <div class="checkbox">
        <label><input type="checkbox" rel="china" onchange="change()"/>China</label>
    </div>
    <div class="checkbox">
        <label><input type="checkbox" rel="usa" onchange="change()"/>USA</label>
    </div>
    <div class="checkbox">
        <label><input type="checkbox" rel="india" onchange="change()"/>India</label>
    </div>
</div>

<div class="result">
    <div class="canada">
         <h1>Canada</h1>
         <h2>Jason</h2>
    </div>
    <div class="china">
         <h1>China</h1>
         <h2>Ni</h2>
    </div>
    <div class="usa">
         <h1>USA</h1>
         <h2>Micheal</h2>
    </div>
    <div class="india">
         <h1>India</h1>
         <h2>Alan</h2>
    </div>
    <div class="india">
         <h1>India</h1>
         <h2>Alan2</h2>
    </div>
</div>

【讨论】:

  • 谢谢,脚本正在运行。但是有一个小问题,如果没有选中复选框,如何使所有项目都显示出来?
  • @Mr.Chingis,现在看看。
  • 对不起,我有一个问题。为什么我不能写类似的类例如如果我写
    ...
    另一个也是印度
    。为什么第二个印度不过滤
  • 非常感谢。抱歉,我还有一个问题,希望是最后一个。我可以添加更多过滤器吗?例如
    ...
    &lt;div class="checkbox"&gt; &lt;label&gt;&lt;input type="checkbox" rel="india" onchange="change()"/&gt;India&lt;/label&gt; &lt;/div&gt; &lt;div class="checkbox"&gt; &lt;label&gt;&lt;input type="checkbox" rel="it" onchange="change()"/&gt;IT&lt;/label&gt; &lt;/div&gt;
  • 你能帮帮我吗?
【解决方案3】:

$(document).ready(function(){
   $('input[type=checkbox]').change(function(){
       if($(this).is(':checked')){           $('.'+$(this).attr('rel')).css('display','block');
       }else{
       $('.'+$(this).attr('rel')).css('display','none');
       }
   });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<div class="filter">
    <div class="checkbox">
        <label><input type="checkbox" rel="canada"/>Canada</label>
    </div>
    <div class="checkbox">
        <label><input type="checkbox" rel="china"/>China</label>
    </div>
    <div class="checkbox">
        <label><input type="checkbox" rel="usa"/>USA</label>
    </div>
    <div class="checkbox">
        <label><input type="checkbox" rel="india"/>India</label>
    </div>
</div>


<div class="result">
    <div class="canada" style="display:none">
         <h1>Canada</h1>
         <h2>Jason</h2>
    </div>
    <div class="china" style="display:none">
         <h1>China</h1>
         <h2>Ni</h2>
    </div>
    <div class="usa" style="display:none">
         <h1>USA</h1>
         <h2>Micheal</h2>
    </div>
    <div class="india" style="display:none">
         <h1>India</h1>
         <h2>Alan</h2>
    </div>
</div>

【讨论】:

  • 非常感谢。抱歉,我还有一个问题。我可以添加更多过滤器吗?例如
    ...
猜你喜欢
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 2019-12-06
相关资源
最近更新 更多