【问题标题】:Check if all child elements have display:none检查所有子元素是否有 display:none
【发布时间】:2018-08-14 12:03:52
【问题描述】:

我正在寻找一种方法来确定 #container 的所有子 div 上是否都有 display:none。 I can't use :visible 因为container 本身是一个隐藏的面板,可以打开(使其可见)和关闭(再次隐藏)。

目标是在面板完全为空时删除“点击打开容器面板”文本,并在至少显示一个子 div 时再次显示。

不同的子 div 在我的代码的其他部分独立显示和关闭。

我试过了:

function check_if_all_divs_are_hidden()
{
    if($('#container').children().css('display') == 'none') {
      //hide text
    }
    else
    {
      //show text
    }
}

但这不起作用,因为如果一个div具有display:none属性,它将隐藏文本,而只有当所有div都具有该属性时才应该隐藏文本。

【问题讨论】:

  • 检查子 div 的总长度和具有 display none 属性的长度。如果它们相同,则隐藏文本。
  • 给他们上课。隐藏时设置班级,计算该班级的孩子
  • @Abinthaha:我如何将css('display') == 'none' 与.length 结合起来?
  • 您不能简单地在一行中完成。您需要遍历孩子并获取显示无属性的孩子的数量。但是通过 .find、.map 等 es6 方法,这可以在一行中完成

标签: jquery html css


【解决方案1】:

检查一下。

$('.check-btn').on('click', function() {
  if($('.item').length === $('.hidden').length)   {
    //hide text
    console.log('same');
  } else {
    //Show Text
    console.log('different');
  }
})
.item {
  display: inline-block;
  width: 300px;'
  height: 300px;
  border: 1px solid #ddd;
  text-align: center
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='#container'>
  <span class='item hidden'>1</span>
  <span class='item hidden'>2</span>
  <span class='item hidden'>3</span>
  <span class='item'>4</span>
  <span class='item hidden'>5</span>
  <span class='item hidden'>6</span>
</div>

<button class='check-btn'>Check</button>

【讨论】:

  • @binoculars:这符合你的预期吗?
  • 好建议!不过,我希望有一个解决方案,而无需更改我的所有课程。赞成。
  • 你可以在不改变类的情况下做同样的事情。如果您愿意,我可以发布解决方案
【解决方案2】:

$(document).ready(function(){
  $('.toggle').on('click', function() {
    if($(this).next('.content').hasClass('active')){
      $(this).text('Show');
      $(this).next('.content').removeClass('active');
    }else{
      $(this).text('Hide');
      $(this).next('.content').addClass('active');
    }
  });
});
.content{
  display:none;
}

.active {
  display: block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='#container'>
  <span class='item'>1</span>
  <button type="button" class="toggle">Show</button>
  <div class="content">Some 1</div>
  <hr>
  <span class='item'>2</span>
  <button type="button" class="toggle">Show</button>
  <div class="content">Some 2</div>
  <hr>
  <span class='item'>3</span>
  <button type="button" class="toggle">Show</button>
  <div class="content">Some 3</div>
</div>

你也可以使用这样的东西:D

【讨论】:

    【解决方案3】:

    你可以试试这个:

    function check_if_all_divs_are_hidden()
    {
        // Hide text
        $('#container').children().each((idx,elt)=>{
            if($(elt).children().css('display') != 'none') {
               //show text
            }
        })
    }
    

    这样,如果所有孩子都被隐藏,它将隐藏文本,如果至少有一个可见,则显示它

    【讨论】:

    • 好的,感谢您告诉我,我会深入研究我的代码以找出问题所在 =)
    【解决方案4】:

    也许使用变量来存储状态会更容易。例如,如果您有多个目标。

         var childrenState = {};
            function open() {
                childrenState[id] = true;
            }
    
    for (var i in childrenState) {
        if (childrenState[i]) {
           showText();
        }
    }
    

    【讨论】:

      【解决方案5】:

      我稍微修改了minitauros' answer,得到了一个可行的解决方案:

      function check_if_all_are_hidden()
      {
          all_are_hidden = true;
          $("#container").children().each(function(){
              if($(this).css('display') !== 'none')
              {
                  all_are_hidden = false;
                  return false;
              }
          });
      
          if (all_are_hidden) {
              console.log("all hidden");
          } else {
              console.log("some are open");
          }
      }
      

      将在 2 天内将此标记为正确答案,除非有人找到更好的方法。

      【讨论】:

        【解决方案6】:

        类似的东西呢

        function check_if_all_divs_are_hidden() {
          let all_are_hidden = true;
        
          $('#container').children().each(child => {
            if ($(child).css('display') !== 'hidden') {
              all_are_hidden = false;
              return false; // Break as we've found one child that isn't hidden, which means not all are hidden.
            }
          });
        
          if (all_are_hidden) {
        
          } else {
        
          }
        }
        

        【讨论】:

        • 这给我一个错误:child.css is not a function
        • 我的错,我觉得应该是$(child).css
        【解决方案7】:

        请尝试以下代码。

         $('#container >div').each(function(){ 
                  if($(this).css('display') == 'none') {
                      //hide text
                    }
                    else
                    {
                      //show text
                    }
             });
        

        【讨论】:

        • 给我:SyntaxError: Unexpected token ;
        • 感谢您的建议。试过你的代码。不幸的是没有为我工作。它得到的最后一个命令是hide,而隐藏面板中显示了一个div。
        • 能否提供您的 div 结构?
        猜你喜欢
        • 2020-02-21
        • 2012-05-10
        • 2014-11-15
        • 1970-01-01
        • 1970-01-01
        • 2022-12-16
        • 1970-01-01
        • 2019-12-22
        • 2013-03-06
        相关资源
        最近更新 更多