【问题标题】:Filter/Find Element which .eq() two different values过滤/查找 .eq() 两个不同值的元素
【发布时间】:2019-08-08 18:15:46
【问题描述】:

我正在尝试过滤一个表格行,该行在一列中具有一个值,而在另一列中具有不同的值。所以逻辑是,如果该列的一行有value1和value2,则隐藏所有其他行。如果没有 value1 和 value2 则全部隐藏。

以下是我已经用jquery尝试过的

var firstDropVal = $('#first .fstselected').text(); //first DropDown Value
var secondDropVal = $('#second .fstselected').text(); // second DropDown Value

// .rows is the class of my table tr
var $rowsNo = $('.rows').filter(function() {
  return $.trim($(this).find('td:visible').eq(0 && 1).text()) !== firstDropVal && secondDropVal
}).hide();

我的表格的 HTML 代码

while($row = mysqli_fetch_array($result)) {

$i++;


 echo "


<tr class='rows' id='rows".$i."'>

<td name='rows".$i."' id='hersteller".$i."' class='text-left'>".$row['Hersteller']."</td>
<td id='artikel".$i."' class='text-left'>".$row['Artikel']."</td>
<td id='mase".$i."' class='text-left'>".$row['Mase']."</td>
<td id='stuecke".$i."' class='text-left'>".$row['Stuecke']."</td>
<td id='herstellerkurz".$i."' class='text-left'>".$row['HerstellerKurz']."</td>
<td id='masekurz".$i."' class='text-left'>".$row['MaseKurz']."</td>
<td id='farbekurz".$i."' class='text-left'>".$row['FarbeKurz']."</td>
<td id='artikelnummer".$i."' class='text-left'>".$row['Artikelnummer']."</td>


</tr>

 "; ```

【问题讨论】:

  • 请发布您的 HTML
  • @Eddie 我现在发布了我的表格
  • 我添加了一个答案。请检查。

标签: javascript jquery html css ajax


【解决方案1】:

为了使示例更简单,我创建了一个只有 2 个列的表格。您可以 hide() all rows 和 filter() 基于下拉菜单

$(".filter").change(function() {
  var color = $("#filter-color").val().trim();
  var number = $("#filter-number").val().trim();

  $(".row").hide().filter(function() {
    return (
      color === "" ||
      color === $(this).find("td:eq(0)").text().trim()
    ) && (
      number === "" ||
      number === $(this).find("td:eq(1)").text().trim()
    )
  }).show();

});
table {
  font-family: arial, sans-serif;
  border-collapse: collapse;
  width: 100%;
}

td, tr {
  border : 1px solid black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
FILTER:

<select id="filter-color" class="filter">
  <option value=""></option>
  <option value="red">red</option>
  <option value="green">green</option>
  <option value="blue">blue</option>
</select>

<select id="filter-number" class="filter">
  <option value=""></option>
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
</select>

<hr />

<table>
  <tr>
    <th>Color</th>
    <th>Number</th>
  </tr>
  <tr class="row">
    <td>red</td>
    <td>2</td>
  </tr>
  <tr class="row">
    <td>green</td>
    <td>1</td>
  </tr>
  <tr class="row">
    <td>blue</td>
    <td>3</td>
  </tr>
  <tr class="row">
    <td>red</td>
    <td>3</td>
  </tr>
  <tr class="row">
    <td>blue</td>
    <td>2</td>
  </tr>
  <tr class="row">
    <td>green</td>
    <td>1</td>
  </tr>
</table>

另一个选项是使用every() 来检查数组

$(".filter").change(function() {

  var filters = [                    //Put the filter values in an array. Make sure it is in order of the <td>
    $("#filter-color").val().trim(),
    $("#filter-number").val().trim()
  ];

  $(".row").hide().filter(function() {
    return $(this).find("td").get().every(function(o, i) {
      return $(o).text().trim() === filters[i] || filters[i] == "";
    });
  }).show();

});
table {
  font-family: arial, sans-serif;
  border-collapse: collapse;
  width: 100%;
}

td,
tr {
  border: 1px solid black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
FILTER:

<select id="filter-color" class="filter">
  <option value=""></option>
  <option value="red">red</option>
  <option value="green">green</option>
  <option value="blue">blue</option>
</select>

<select id="filter-number" class="filter">
  <option value=""></option>
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
</select>

<hr />

<table>
  <tr>
    <th>Color</th>
    <th>Number</th>
  </tr>
  <tr class="row">
    <td>red</td>
    <td>2</td>
  </tr>
  <tr class="row">
    <td>green</td>
    <td>1</td>
  </tr>
  <tr class="row">
    <td>blue</td>
    <td>3</td>
  </tr>
  <tr class="row">
    <td>red</td>
    <td>3</td>
  </tr>
  <tr class="row">
    <td>blue</td>
    <td>2</td>
  </tr>
  <tr class="row">
    <td>green</td>
    <td>1</td>
  </tr>
</table>

【讨论】:

  • 谢谢你这正是我所需要的!
  • 很高兴听到。如果这对您有帮助,请点击左侧的勾选接受我的回答:)
【解决方案2】:

这些与您尝试使用它们的方式不同

.eq(0 && 1)
firstDropVal && secondDropVal

由于运算符优先级:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

您需要 4 个单独的测试(还有其他方法,但本质上就是您正在做的)

return 
    $.trim($(this).find('td:visible').eq(0).text()) === firstDropVal
    || $.trim($(this).find('td:visible').eq(1).text()) === secondDropVal
    || $.trim($(this).find('td:visible').eq(0).text()) === firstDropVal
    || $.trim($(this).find('td:visible').eq(1).text()) === secondDropVal

【讨论】:

  • 非常感谢您的回答,我现在就试试看
  • TBH 不太清楚你要做什么 - 所以你可能需要切换逻辑(可能用return !(...) 包装上面的逻辑)或者你可能根本不想使用过滤器。看起来像一个典型的表格搜索/过滤器,所以应该没问题。
  • 我认为它也可能是return $.trim($(this).find('td:visible').eq(0).text()) !== firstDropVal &amp;&amp; $.trim($(this).find('td:visible').eq(1).text()) !== secondDropVal,但正如@freedomn-m 所建议的那样,它并不清楚
  • 好吧,从 2 天开始,我只是想弄清楚如何使用多个下拉列表来过滤表格。 TBH 这就是我想做的所有事情,我尝试了许多不同的方法,但仍然无法弄清楚如何简单地过滤具有多个下拉列表的表。如果您看到图片,您应该知道我的意思。 i.stack.imgur.com/QvWJY.png
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
相关资源
最近更新 更多