javascript - jQuery 在搜索中切换父级

标签 javascript jquery html

我有一个与此类似的表格:

<input id="mySearch" placeholder="Search..." type="text"/>
<table>
  <th>Main header</th>
  <tbody id="searchable">
    <tr class="parent"><td>Parent</td></tr>
    <tr class="subparent"><td>Subparent one</td></tr>
    <tr class="child"><td>Child one</td></tr>
    <tr class="subparent"><td>Subparent two</td></tr>
    <tr class="child"><td>Child two</td></tr>
  </tbody>
</table>

然后我想做的是搜索表格并显示与搜索条件匹配的元素,并展开它们各自的子父级(“父级”从不隐藏)。

如果我搜索“子二号”,则应切换“子二号”的子父级和子父级,但不应切换“子一号”的子级或子父级。搜索“child”应该切换两个子级和两个子父级。

这是我当前的脚本,它可以工作,但它也会切换其子级与搜索不匹配的子父级:

<script src="jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
  $("#mySearch").on("keyup", function() {
    var value = $(this).val().toLowerCase();
    $("#searchable tr").filter(function() {
      $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1).prev('.subparent').toggle();
    });
  });
});
</script>

表的结构如下:

Main category
`-> Main subcategory (parent)
`--> Specific subcategory (subparent)
`---> Data to search (child)

在更大范围内,这转化为:

Main category
`-> Parent 1
`--> Subparent 1
`---> Data 1
`---> Data 2
`---> Data 3
`--> Subparent 2
`---> Data 1
`---> Data 2
`-> Parent 2
`--> Subparent 1
`---> Data 1

因此,我需要搜索隐藏在(子)父级下方的所有数据,并展开子级和子父级以查找搜索中的所有匹配项。

如何才能仅切换子级与搜索匹配的子级?

最佳答案

您可以使用下面的脚本,在 keyup 事件中,您需要先隐藏所有行,然后过滤找到匹配项的子行,如果找到匹配项,则也显示其子父行。

看下面的代码

$(document).ready(function () {
  $("#mySearch").on("keyup", function() {
    var value = $(this).val().toLowerCase();
    //hide all rows
    $("#searchable tr.subparent, #searchable tr.child").hide();
    //show rows
    $("#searchable tr.child").filter(function() {
      var found = $(this).text().toLowerCase().indexOf(value)!=-1;
      if(found) { // show subparent if child matches
        if($(this).prev().hasClass('subparent')) {
           $(this).prev().show();
        } else {
          $(this).prevUntil('.subparent').last().prev().show();
        }
      }
      return found;
    }).show();
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="mySearch" placeholder="Search..." type="text"/>
<table>
  <th>Main header</th>
  <tbody id="searchable">
    <tr class="parent"><td>Parent</td></tr>
    <tr class="subparent"><td>Subparent one three four</td></tr>
    <tr class="child"><td>Child four</td></tr>
    <tr class="child"><td>Child three</td></tr>
    <tr class="child"><td>Child one</td></tr>
    <tr class="subparent"><td>Subparent two five six</td></tr>
    <tr class="child"><td>Child two</td></tr>
    <tr class="child"><td>Child five</td></tr>
    <tr class="child"><td>Child six</td></tr>
  </tbody>
</table>

关于javascript - jQuery 在搜索中切换父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60375726/

相关文章:

javascript - 条件注释 - 包含基于 IE 版本的 javascript

javascript - 如何在浏览器中使用JS访问Azure Blob存储

javascript - 免费jqGrid-行未输入编辑

javascript - Jquery 手机 : Add next and previous buttons

jquery - 如何使用 jQUery Ajax 更新表行?

javascript - 滚动时如何禁用移动设备上的点击事件?

javascript - 随机图像选择

jquery - 查找与特定类一起检查的复选框

javascript - JQuery Accordion 图像并排

javascript - 为什么 Chrome 在使用 jQuery Draggable 时会删除 SVG 上的图像图案?