隐藏具有多个复选框的行

时间:2017-02-19 19:46:29

标签: jquery checkbox filter tablesorter

我有一个HTML表格,我想在其中隐藏/显示基于多个复选框的行。

选中复选框时(基于文本标准),某些行会隐藏,如果未选中,则会显示所有行。如果选中了2个或更多复选框,则除了满足所有选中复选框的条件的行外,所有行都是隐藏的。但如果我取消选中任何一个checbox,则会显示所有行。

我的问题是,当我取消选中其中一个复选框时,如何才能显示符合所有当前所选复选框条件的行?

为了更好地理解,我需要检查哪些行已被其他复选框隐藏,并且在未选中复选框时不显示它们。

工作案例示例: 选中checkbox1和checkbox2:仅显示row1,如果取消选中checkbox2,则只显示row1和row3

HTML:

<label><input type="checkbox" id="checkbox1">Teacher</label>
<label><input type="checkbox" id="checkbox2">Tennis</label>
<label><input type="checkbox" id="checkbox3">Married</label>

    <table id="table" border="1">
    <thead>
        <th>First Name</th>
        <th>Last Name</th>
        <th>Profession</th>
        <th>Hobby</th>
        <th>Married</th>
    </thead>
    <tbody>
    <tr id="row1">
      <td>John</td>
      <td>Doe</td>
      <td>Teacher</td>
      <td>Tennis</td>
      <td>Yes</td>
    </tr>
    <tr id="row2">
      <td>Eve</td>
      <td>Jackson</td>
      <td>Doctor</td>
      <td>Darts</td>
      <td>No</td>
    </tr>
    <tr id="row3">
      <td>Adam</td>
      <td>Johnson</td>
      <td>Teacher</td>
      <td>Skydiving</td>
      <td>Yes</td>
    </tr>
     <tr id="row4">
      <td>Nina</td>
      <td>Pursuit</td>
      <td>Lawyer</td>
      <td>Tennis</td>
      <td>Yes</td>
    </tr>
    </tbody>
    </table> 

jQuery的:

$(document).ready(function () {
    $('#checkbox1').change(function () {
            for (var i = 0; i < 5; i++) {
                if ((this.checked) && $("#table #row"+i+" td:nth-child(3):not(:contains('Teacher'))").length){
                    $('#row'+i).fadeOut('slow');
                } 
                if (!this.checked) $('#row'+i).fadeIn('slow');
                }
    });

    $('#checkbox2').change(function () {
            for (var i = 0; i < 5; i++) {
                if ((this.checked) && $("#table #row"+i+" td:nth-child(4):not(:contains('Tennis'))").length){
                    $('#row'+i).fadeOut('slow');
                } 
                if (!this.checked) $('#row'+i).fadeIn('slow');
                }
    });

    $('#checkbox3').change(function () {
            for (var i = 0; i < 5; i++) {
                if ((this.checked) && $("#table #row"+i+" td:nth-child(5):not(:contains('Yes'))").length){
                    $('#row'+i).fadeOut('slow');
                } 
                if (!this.checked) $('#row'+i).fadeIn('slow');
                }
    });
});

JSFiddle DEMO

4 个答案:

答案 0 :(得分:0)

您不需要跟踪它。只显示所有行,并处理隐藏条件以隐藏匹配的行。

这样的事情:

When a checkbox is changed
Show all rows
Check all checkboxes, and hide those rows that match the criteria

由于这将是单帧上的表演者,因此浏览器不会闪烁,从而实现干净,快速的变化。

答案 1 :(得分:0)

您可以创建一个检查所有内容并显示/隐藏行的功能,只需在复选框change事件中调用它,例如:

&#13;
&#13;
function show_hide_rows() {
	var checkbox1=($('#checkbox1').is(':checked') ? true : false),
		checkbox2=($('#checkbox2').is(':checked') ? true : false),
		checkbox3=($('#checkbox3').is(':checked') ? true : false);
	
	var passed;
	for (var i = 0; i < 5; i++) {
		passed = false;
		if (checkbox1 && $("#table #row"+i+" td:nth-child(3):not(:contains('Teacher'))").length) passed = true;
		if (checkbox2 && $("#table #row"+i+" td:nth-child(4):not(:contains('Tennis'))").length) passed = true;
		if (checkbox3 && $("#table #row"+i+" td:nth-child(5):not(:contains('Yes'))").length) passed = true;
		
		if (passed) $('#row'+i).fadeOut('slow');
		else $('#row'+i).fadeIn('slow');
		}
}

$(function(){
  $('input[type="checkbox"]').on('change', function(){ show_hide_rows(); });
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label><input type="checkbox" id="checkbox1">Teacher</label>
<label><input type="checkbox" id="checkbox2">Tennis</label>
<label><input type="checkbox" id="checkbox3">Married</label>

    <table id="table" border="1">
    <thead>
        <th>First Name</th>
        <th>Last Name</th>
        <th>Profession</th>
        <th>Hobby</th>
        <th>Married</th>
    </thead>
    <tbody>
    <tr id="row1">
      <td>John</td>
      <td>Doe</td>
      <td>Teacher</td>
      <td>Tennis</td>
      <td>Yes</td>
    </tr>
    <tr id="row2">
      <td>Eve</td>
      <td>Jackson</td>
      <td>Doctor</td>
      <td>Darts</td>
      <td>No</td>
    </tr>
    <tr id="row3">
      <td>Adam</td>
      <td>Johnson</td>
      <td>Teacher</td>
      <td>Skydiving</td>
      <td>Yes</td>
    </tr>
     <tr id="row4">
      <td>Nina</td>
      <td>Pursuit</td>
      <td>Lawyer</td>
      <td>Tennis</td>
      <td>Yes</td>
    </tr>
    </tbody>
    </table>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

$(document).ready(function() {
  $('#checkbox1').change(function() {
    for (var i = 0; i < 5; i++) {
      if ((this.checked) && $("#table #row" + i + " td:nth-child(3):not(:contains('Teacher'))").length) {
        //				$('#row'+i).fadeOut('slow');
        $('#table #row' + i).addClass('check1');
      }
      if (!this.checked) $('#table #row' + i).removeClass('check1');
    }
  });

  $('#checkbox2').change(function() {
    for (var i = 0; i < 5; i++) {
      if ((this.checked) && $("#table #row" + i + " td:nth-child(4):not(:contains('Tennis'))").length) {
        //					$('#row'+i).fadeOut('slow');
        $('#table #row' + i).addClass('check2');
      }
      if (!this.checked) $('#table #row' + i).removeClass('check2');
    }
  });

  $('#checkbox3').change(function() {
    for (var i = 0; i < 5; i++) {
      if ((this.checked) && $("#table #row" + i + " td:nth-child(5):not(:contains('Yes'))").length) {
        //$('#row'+i).fadeOut('slow');
        $('#table #row' + i).addClass('check3');
      }
      if (!this.checked) $('#table #row' + i).removeClass('check3');
    }
  });
  $('.checkbox').change(function() {
    for (var i = 0; i < 5; i++) {
      if ($("#table #row" + i).hasClass('check1') || $("#table #row" + i).hasClass('check2') || $("#table #row" + i).hasClass('check3')) {
        $('#row' + i).fadeOut('slow');
        //  $('#table #row'+i).addClass('check3');
      } else {
        $('#row' + i).fadeIn('slow');
      }

    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>
  <input type="checkbox" class="checkbox" id="checkbox1">Teacher</label>
<label>
  <input type="checkbox" class="checkbox" id="checkbox2">Tennis</label>
<label>
  <input type="checkbox" class="checkbox" id="checkbox3">Married</label>

<table id="table" border="1">
  <thead>
    <th>First Name</th>
    <th>Last Name</th>
    <th>Profession</th>
    <th>Hobby</th>
    <th>Married</th>
  </thead>
  <tbody>
    <tr id="row1">
      <td>John</td>
      <td>Doe</td>
      <td>Teacher</td>
      <td>Tennis</td>
      <td>Yes</td>
    </tr>
    <tr id="row2">
      <td>Eve</td>
      <td>Jackson</td>
      <td>Doctor</td>
      <td>Darts</td>
      <td>No</td>
    </tr>
    <tr id="row3">
      <td>Adam</td>
      <td>Johnson</td>
      <td>Teacher</td>
      <td>Skydiving</td>
      <td>Yes</td>
    </tr>
    <tr id="row4">
      <td>Nina</td>
      <td>Pursuit</td>
      <td>Lawyer</td>
      <td>Tennis</td>
      <td>Yes</td>
    </tr>
  </tbody>
</table>

您可以查看此解决方案。

答案 3 :(得分:0)

要实现所需的行为,您需要在隐藏每个元素时存储每个元素的实际状态。这为所有复选框使用了一个事件监听器。

逻辑非常简单:迭代所有行并在满足以下条件时隐藏当前行:

  1. 选中复选框
  2. 该行尚未隐藏
  3. 该行包含特定元素
  4. 每次隐藏都涉及对状态对象的更新,最后显示的所有行都不在此状态对象中。

    $(document).ready(function () {
      $('input[type="checkbox"]').click(function() {
    
        var checkbox_1 = $('#checkbox1')[0].checked
        var checkbox_2 = $('#checkbox2')[0].checked
        var checkbox_3 = $('#checkbox3')[0].checked
        var state = {}
    
        for (var i = 0; i < 5; i++) {
          if (checkbox_1 && !state[i] && $("#table #row"+i+" td:nth-child(3):not(:contains('Teacher'))").length){
            $('#row'+i).fadeOut('slow');
            state[i] = "hidden"
          }
          if (checkbox_2 && !state[i] && $("#table #row"+i+" td:nth-child(4):not(:contains('Tennis'))").length){
            $('#row'+i).fadeOut('slow');
            state[i] = "hidden"
          }
          if (checkbox_3 && !state[i] && $("#table #row"+i+" td:nth-child(5):not(:contains('Yes'))").length){
            $('#row'+i).fadeOut('slow');
            state[i] = "hidden"
          }
          if (!state[i]) {
            $('#row'+i).fadeIn('slow');
          }
        }
      });
    });