【问题标题】:How to hide multiple elements based on visibility state of other similarly named elements如何根据其他类似命名元素的可见性状态隐藏多个元素
【发布时间】:2020-10-29 12:23:42
【问题描述】:

问题:我想根据是否显示类似名称元素的子元素来隐藏多个元素。

上下文:我在一个 div 中包含多个列表项,如下所示:

<div class="itemGrid">
   <ul>
      <li>
         <button class="header" id="headerCommonItems">
            "Common Items"
            ::after
         </button>
         <ul class="icons" id="iconsCommonItems">
            <li class="itemTile">Apples</li>
            <li class="itemTile">Oranges</li>
         </ul>
      </li>
      <li>
         <button class="header" id="headerUncommonItems">
            "Uncommon Items"
            ::after
         </button>
         <ul class="icons" id="iconsUncommonItems">
            <li class="itemTile">Pears</li>
            <li class="itemTile">Bananas</li>
         </ul>
      </li>
      <li>
         <button class="header" id="headerRareItems">
            "Rare Items"
            ::after
         </button>
         <ul class="icons" id="iconsRareItems">
            <li class="itemTile">Pineapples</li>
            <li class="itemTile">Guavas</li>
         </ul>
      </li>
   </ul>
</div>

我有一个搜索功能,可以根据搜索条件显示/隐藏图标(例如,如果我搜索术语“common”,它只会显示 Apples 和 Oranges 的图标,但隐藏所有其他图标)。

如果没有可见的相应图标,我想隐藏标题。因此,使用前面的示例,我只希望“Common Items”标题显示我是否正在搜索术语“Common”并隐藏“Uncommon Items”和“Rare Items”标题。目前,即使下面没有图标,它仍然会显示其他标题。

我尝试引用多个 SO 页面,但这是我第一次使用 JQuery,我似乎无法让它工作。这是我迄今为止尝试过的一种变体。

$.each($("[id ^= 'icons']").filter(
    function()
    {
        if ($(this).find('li:visible').length !== 0)
        {
            console.log("Visible children.");
            return;
        }
    }))
.hide();

我已经能够隐藏图标,但是如果图标的子元素被隐藏,我不知道如何引用相应的标题并隐藏它们。

这是我一直参考的其他 SO 页面:

Check if all children elements are hidden

How to hide parent if children are hidden?

【问题讨论】:

  • 菠萝和番石榴等子项是否动态添加/删除?据我了解,您只想根据搜索查询隐藏整个部分?
  • 嗨@Bren,是的,像菠萝和番石榴这样的项目是动态添加/删除的(更像是隐藏/取消隐藏)。搜索通过从所有图标“visibleItem”中删除一个类并将“visibleItem”类重新添加回与搜索条件匹配的图标。
  • 您是否正在寻找能够同时搜索诸如“apple”之类的术语的功能,它返回菠萝和苹果,因为它们的名称相似并且都包含苹果?当我说添加/删除时,我指的是实际从 DOM 中添加和删除的元素,而不是隐藏它的 CSS。
  • 嗨,不是真正的搜索。鉴于您的情况,现在当我搜索“Apple”时,我已经在各自的标题下找到了“Apple”和“Pineapple”(“Apple”的常见项目和“Pineapple”的稀有项目)。但我也得到的是 Uncommon Items 的标题,下面没有任何项目。我想看看Uncommon Items下面是不是没有item,然后把Uncommon Items表头也隐藏起来。

标签: javascript html jquery


【解决方案1】:

如果我理解正确:“如果没有可见的相应图标,我想隐藏标题”;

只需更改您的 if 逻辑以查找隐藏的、不可见的 === 0,然后搜索该元素兄弟(.header 不是 ul class="icons" 的子元素):

$(this).siblings(".header").hide();

我还添加了删除列表图标:

$(this).parents("li").hide();

从下面的示例中可以看出,如果列表 "Uncommon Items" 中的两个项目都有类:hidden,它将删除它周围的所有项目。如果一个可见,它不会。

$.each($("[id ^= 'icons']").filter(
    function() {
    
      $(this).siblings(".header").show();
      $(this).parents("li").show();
      
      if ($(this).find('li:visible').length === 0) {
        $(this).siblings(".header").hide();
        $(this).parents("li").hide();
        console.log("Hidden children.");
        return;
      }
    }))
  .hide();
.hidden {
  display: none
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="itemGrid">
  <ul>
    <li>
      <button class="header" id="headerCommonItems">
            "Common Items"
            ::after
         </button>
      <ul class="icons" id="iconsCommonItems">
        <li class="itemTile">Apples</li>
        <li class="itemTile">Oranges</li>
      </ul>
    </li>
    <li>
      <button class="header" id="headerUncommonItems">
            "Uncommon Items"
            ::after
         </button>
      <ul class="icons" id="iconsUncommonItems">
        <li class="itemTile hidden">Pears</li>
        <li class="itemTile hidden">Bananas</li>
      </ul>
    </li>
    <li>
      <button class="header" id="headerRareItems">
            "Rare Items"
            ::after
         </button>
      <ul class="icons" id="iconsRareItems">
        <li class="itemTile">Pineapples</li>
        <li class="itemTile">Guavas</li>
      </ul>
    </li>
  </ul>
</div>

编辑:

根据要求将其添加到您的 if 语句之外,它将始终首先显示/重置所有内容,然后在 if 语句中进行新的过滤。

  $(this).siblings(".header").show();
  $(this).parents("li").show();

【讨论】:

  • 我想这正是我要找的!我相信我遇到了类似的问题。有没有办法让它在搜索栏中的击键时重置?与现在一样,使用搜索词“apple”,Uncommon Headers 会消失,但即使在搜索栏被清除后仍会消失。
  • @BryanTran 我编辑了帖子和 sn-p,这应该可以解决这个问题。但是您正在谈论我看不到的搜索栏和击键,如果您正在调用此函数,则此修复程序应该可以做到。
  • @BryanTran 如果没有,请使用minimal reproducible example 提出/编辑问题,以便我了解发生了什么。
  • 您的编辑修复了它。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2017-04-22
  • 2013-07-06
  • 1970-01-01
  • 2012-07-11
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多