【问题标题】:How do you filter table via JavaScript with a bootstrap dropdown?如何使用引导下拉菜单通过 JavaScript 过滤表?
【发布时间】:2017-09-07 13:02:32
【问题描述】:

我认为我的问题比我在互联网上看到的要复杂一些,因为我需要在一张桌子上进行多次过滤。所以这是我的代码:

function searchTable() {
  var input, filter, table, tr, td, i;
  input = document.getElementById("search");
  filter = input.value.toUpperCase();
  table = document.getElementById("table");
  tr = table.getElementsByTagName("tr");
  for (i = 0; i < tr.length; i++) {
    td = tr[i].getElementsByTagName("td")[0];
    if (td) {
      if (td.innerHTML.toUpperCase().indexOf(filter) > -1) {
        tr[i].style.display = "";
      } else {
        tr[i].style.display = "none";
      }
    }
  }
}
#table {
  border-collapse: collapse;
  width: 100%;
  border: 1px solid #ddd;
  margin-top: 20px;
}

#table th,
#table td {
  text-align: left;
  padding: 12px;
}

#table tr {
  border-bottom: 1px solid #ddd;
}

#table tr.header,
#table tr:hover {
  background-color: #f1f1f1;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>
<div class="input-group">
  <input class="form-control" id="search" onkeyup="searchTable();" placeholder="search distribution" name="s" autocomplete="off" autofocus>
  <div class="input-group-btn">
    <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Devices</button>
    <div class="dropdown-menu dropdown-menu-right">
      <a class="dropdown-item" href="javascript:void(0)" onclick="">Desktop</a>
      <a class="dropdown-item" href="javascript:void(0)">Mobile</a>
      <a class="dropdown-item" href="javascript:void(0)">Tablet</a>
    </div>
  </div>
</div>
<table id="table" class="table-striped table-hover">
  <tr class="header">
    <th style="width:35%;">Distribution</th>
    <th style="width:35%;">Supported devices</th>
    <th style="width:20%;">Download</th>
  </tr>
  <tr>
    <td>Glass '17</td>
    <td>Desktop & Mobile</td>
    <td><a href="#" class="btn btn-primary" target="_blank">Download</a></td>
  </tr>
  <tr>
    <td>Glass '17</td>
    <td>Tablet</td>
    <td><a href="#" class="btn btn-primary" target="_blank">Download</a></td>
  </tr>
  <tr>
    <td>Other distribution</td>
    <td>Mobile</td>
    <td><a href="#" class="btn btn-primary" target="_blank">Download</a></td>
  </tr>
  <tr>
    <td>Distribution 3</td>
    <td>Tablet & Mobile</td>
    <td><a href="#" class="btn btn-primary" target="_blank">Download</a></td>
  </tr>
</table>

seachTable() 函数用于根据&lt;td&gt;(第一个孩子)的内容过滤表格。我想要实现的也是按设备类型过滤表。困难的部分是,一些发行版支持不止一种设备类型。


我尝试了什么?

function searchTable() {
  var input, filter, table, tr, td, i;

  var input = document.getElementById("search");
  var filter = input.value.toUpperCase();
  var table = document.getElementById("table");
  var tr = table.getElementsByTagName("tr");

  for (var i = 1; i < tr.length; i++) {
    var tds = tr[i].getElementsByTagName("td");
    var firstCol = tds[0].textContent.toUpperCase();
    var secondCol = tds[1].textContent.toUpperCase();
    if (firstCol.indexOf(filter) > -1 || secondCol.indexOf(filter) > -1) {
      tr[i].style.display = "";
    } else {
      tr[i].style.display = "none";
    }
  }
}

function searchTableDevice(device) {
  var filter, table, tr, td, i;

  $("#deviceSelector").html(device);

  var filter = device.toUpperCase();
  var table = document.getElementById("table");
  var tr = table.getElementsByTagName("tr");
  if (device == "all") {
    $("#table tr").css("display", "");
    $("#deviceSelector").html("Devices");
  } else {
    searchTable();
    for (var i = 1; i < tr.length; i++) {
      var tds = tr[i].getElementsByTagName("td");
      var secondCol = tds[1].textContent.toUpperCase();
      if (secondCol.indexOf(filter) > -1) {
        tr[i].style.display = "";
      } else {
        tr[i].style.display = "none";
      }
    }
  }
}
#table {
  border-collapse: collapse;
  width: 100%;
  border: 1px solid #ddd;
  margin-top: 20px;
}

#table th,
#table td {
  text-align: left;
  padding: 12px;
}

#table tr {
  border-bottom: 1px solid #ddd;
}

#table tr.header,
#table tr:hover {
  background-color: #f1f1f1;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>
<div class="input-group">
  <input class="form-control" id="search" onkeyup="searchTable();" placeholder="search distribution" name="s" autocomplete="off" autofocus>
  <div class="input-group-btn">
    <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" id="deviceSelector">
						  Devices
						</button>
    <div class="dropdown-menu dropdown-menu-right">
      <a class="dropdown-item" href="javascript:void(0)" onclick="searchTableDevice(this.innerHTML)">Desktop</a>
      <a class="dropdown-item" href="javascript:void(0)" onclick="searchTableDevice(this.innerHTML)">Mobile</a>
      <a class="dropdown-item" href="javascript:void(0)" onclick="searchTableDevice(this.innerHTML)">Tablet</a>
      <div role="separator" class="dropdown-divider"></div>
      <a class="dropdown-item" href="javascript:void(0)" onclick="searchTableDevice('all')">All</a>
    </div>
  </div>
</div>
<table id="table" class="table-striped table-hover">
  <tr class="header">
    <th style="width:35%;">Distribution</th>
    <th style="width:35%;">Supported devices</th>
    <th style="width:20%;">Download</th>
  </tr>
  <tr>
    <td>Glass '17</td>
    <td>Desktop & Mobile</td>
    <td><a href="#" class="btn btn-primary" target="_blank">Download</a></td>
  </tr>
  <tr>
    <td>Glass '17</td>
    <td>Tablet</td>
    <td><a href="#" class="btn btn-primary" target="_blank">Download</a></td>
  </tr>
  <tr>
    <td>Other distribution</td>
    <td>Mobile</td>
    <td><a href="#" class="btn btn-primary" target="_blank">Download</a></td>
  </tr>
  <tr>
    <td>Distribution 3</td>
    <td>Tablet & Mobile</td>
    <td><a href="#" class="btn btn-primary" target="_blank">Download</a></td>
  </tr>
</table>

我尝试创建一个新函数searchTableDevice(),其内容与searchTable() 相似,但不是从输入中获取文本,而是从下拉列表中的&lt;a&gt; 元素中获取文本。发生了什么? searchTable()style.display = "block" 设置为与输入文本匹配的行,并且还显示了由 seacrhTableDevice() 隐藏的行。我完全不知道该怎么做。


任何帮助都将受到高度赞赏和欢迎。提前致谢!

【问题讨论】:

    标签: javascript filter html-table bootstrap-4


    【解决方案1】:

    工作代码。

    $(function () {
    	$('#search').on('input', function () {
    		searchRow();
    	});
    })
    
    function searchRow() {
    	var $rows = $('#table > tbody > tr').not(".header");
    	var val1 = $.trim($('#search').val()).replace(/ +/g, ' ').toLowerCase();
    	var val2 = $.trim($("#deviceSelector").text()).toLowerCase();
    	val2 = (val2 === "devices") ? "" : val2;
    
    	$rows.show().filter(function () {
    		var text1 = $(this).find('td:nth-child(1)').text().replace(/\s+/g, ' ').toLowerCase();
    		var text2 = $(this).find('td:nth-child(2)').text().replace(/\s+/g, ' ').toLowerCase();
    		return !~text1.indexOf(val1) || !~text2.indexOf(val2);
    	}).hide();
    }
    
    function searchTableDevice(device) {
    	var filter, table, tr, td, i;
    
    	$("#deviceSelector").html(device);
    
    	if (device == "all") {
    		$("#deviceSelector").html("Devices");
    	}
    
    	searchRow();
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha/css/bootstrap.min.css" rel="stylesheet" />
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
    
    <style type="text/css">
    	#table {
    		border-collapse: collapse;
    		width: 100%;
    		border: 1px solid #ddd;
    		margin-top: 20px;
    	}
    
    	#table th,
    	#table td {
    		text-align: left;
    		padding: 12px;
    	}
    
    	#table tr {
    		border-bottom: 1px solid #ddd;
    	}
    
    	#table tr.header,
    	#table tr:hover {
    		background-color: #f1f1f1;
    	}
    </style>
    
    <div class="input-group">
    	<input class="form-control" id="search" placeholder="search distribution" name="s" autocomplete="off"
    		autofocus>
    	<div class="input-group-btn">
    		<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"
    			id="deviceSelector">
    					  Devices
    					</button>
    		<div class="dropdown-menu dropdown-menu-right">
    			<a class="dropdown-item" href="javascript:void(0)" onclick="searchTableDevice(this.innerHTML)">Desktop</a>
    			<a class="dropdown-item" href="javascript:void(0)" onclick="searchTableDevice(this.innerHTML)">Mobile</a>
    			<a class="dropdown-item" href="javascript:void(0)" onclick="searchTableDevice(this.innerHTML)">Tablet</a>
    			<div role="separator" class="dropdown-divider"></div>
    			<a class="dropdown-item" href="javascript:void(0)" onclick="searchTableDevice('all')">All</a>
    		</div>
    	</div>
    </div>
    
    <table id="table" class="table-striped table-hover">
    	<tr class="header">
    		<th style="width:35%;">Distribution</th>
    		<th style="width:35%;">Supported devices</th>
    		<th style="width:20%;">Download</th>
    	</tr>
    	<tr>
    		<td>Glass '17</td>
    		<td>Desktop & Mobile</td>
    		<td><a href="#" class="btn btn-primary" target="_blank">Download</a></td>
    	</tr>
    	<tr>
    		<td>Glass '17</td>
    		<td>Tablet</td>
    		<td><a href="#" class="btn btn-primary" target="_blank">Download</a></td>
    	</tr>
    	<tr>
    		<td>Other distribution</td>
    		<td>Mobile</td>
    		<td><a href="#" class="btn btn-primary" target="_blank">Download</a></td>
    	</tr>
    	<tr>
    		<td>Distribution 3</td>
    		<td>Tablet & Mobile</td>
    		<td><a href="#" class="btn btn-primary" target="_blank">Download</a></td>
    	</tr>
    </table>

    【讨论】:

    • 不是真的,我想过滤表格以仅显示第二个单元格中具有“移动”的行,如果在下拉列表中用户点击“移动”
    • 感谢您的反馈。我修复了它并更新了代码
    • 是的,但是如果您选择例如“桌面”,它将列出桌面的所有发行版。然后,如果在输入搜索中输入了一些内容,那么它还会列出其他设备的分布。我想让它只列出所选设备的分布,直到用户选择“全部”。我在我的代码上做了更多工作,我将在接下来的 2 分钟内用新版本更新它。
    • 感谢您抽出宝贵时间回答我的问题。如果您认为我想要的东西是不可能的,请告诉我,我会从我的网站上删除设备选择器
    • "Uncaught ReferenceError: $ is not defined" for line 1 "$(function () {" 我确信 jQuery 正在运行。下拉过滤有效,其余无效。
    猜你喜欢
    • 2018-09-06
    • 2020-10-01
    • 1970-01-01
    • 2021-04-10
    • 2015-12-29
    • 2015-04-02
    • 1970-01-01
    • 2018-01-21
    相关资源
    最近更新 更多