【问题标题】:How do I check if an element is hidden in jQuery?如何检查一个元素是否隐藏在 jQuery 中?
【发布时间】:2010-09-15 18:04:25
【问题描述】:

是否可以使用函数.hide().show().toggle() 来切换元素的可见性?

如何测试一个元素是visible 还是hidden

【问题讨论】:

标签: javascript jquery dom visibility


【解决方案1】:
if ( $(element).css('display') == 'none' || $(element).css("visibility") == "hidden"){
    // 'element' is hidden
}

上述方法没有考虑父级的可见性。如果还要考虑父母,您应该使用.is(":hidden").is(":visible")

例如,

<div id="div1" style="display:none">
  <div id="div2" style="display:block">Div2</div>
</div>

上述方法将认为div2 可见,而:visible 不可见。但是上面的方法在很多情况下可能很有用,尤其是当您需要查找隐藏的父级中是否有任何可见的错误 div 时,因为在这种情况下:visible 将不起作用。

【讨论】:

  • 这仅检查单个元素的显示属性。 :visible 属性还检查父元素的可见性。
  • 这是在使用 IE 8 进行测试时唯一对我有用的解决方案。
  • @chiborg 是的,但有时这正是你想要的,我不得不学习如何“聪明”的 jQuery...
  • 这确实回答了这个问题,因为问题是关于单个元素并且通过使用 hide()show()toggle() 函数,但是,正如大多数人已经说过的那样,我们应该使用:visible:hidden 伪类。
  • 当元素存在但当前不在页面上时可以使用此答案,例如在detach()之后。
【解决方案2】:

您可以使用hidden 选择器:

// Matches all elements that are hidden
$('element:hidden')

还有visible 选择器:

// Matches all elements that are visible
$('element:visible')

【讨论】:

  • 请注意,本演示文稿中有一些与性能相关的良好提示:addyosmani.com/jqprovenperformance
  • 在第 21 到 28 页上,它显示了 :hidden 或 :visible 与其他选择器相比有多慢。感谢您指出这一点。
  • 当您处理几个元素并且很少发生时 - 即大多数情况下 - 时间问题是一个可笑的次要问题。哦,不!它花了 42 毫秒而不是 19 毫秒!!!
  • 我正在使用此选择器手动切换元素。 $('element:hidden') 对我来说总是正确的!
  • @cwingrav 您可能需要重新阅读文档, :hidden 适用于所有元素。带有type="hidden" 的表单元素只是可以触发:hidden 的一种情况。没有高度和宽度的元素、带有display: none 的元素以及具有隐藏祖先的元素也将被视为:hidden。
【解决方案3】:

由于问题涉及单个元素,因此此代码可能更合适:

// Checks CSS content for display:[none|block], ignores visibility:[true|false]
$(element).is(":visible");

// The same works with hidden
$(element).is(":hidden");

twernt's suggestion相同,但应用于单个元素;和它matches the algorithm recommended in the jQuery FAQ

我们使用 jQuery 的 is() 来检查选定的元素与另一个元素、选择器或任何 jQuery 对象。该方法遍历 DOM 元素以找到满足传递参数的匹配项。如果匹配则返回true,否则返回false。

【讨论】:

  • 这个解决方案似乎会鼓励混淆visible=falsedisplay:none;而 Mote 的解决方案清楚地说明了编码人员检查display:none 的意图; (通过提及隐藏和显示哪个控件display:none 而不是visible=true
  • 没错,但:visible 也会检查父元素是否可见,正如 chiborg 指出的那样。
  • 您说得有道理 - 我会明确表示代码仅检查 display 属性。鉴于最初的问题是针对show()hide(),并且他们设置了display,我的回答是正确的。顺便说一句,它确实适用于 IE7,这是一个测试 sn-p - jsfiddle.net/MWZss ;
  • 其实我发现逆向逻辑的话更好:!$('selector').is(':hidden');因为某些原因。值得一试。
  • 这是一个简单的基准测试 is() 针对 regexp:jsperf.com/jquery-is-vs-regexp-for-css-visibility。结论:如果您不追求性能,请在 is() 上使用正则表达式(因为 is() 在查看实际元素之前先查找所有隐藏节点)。
【解决方案4】:

通常在检查某些东西是否可见时,您会立即继续并用它做其他事情。 jQuery 链接让这一切变得简单。

因此,如果您有一个选择器,并且您希望仅在可见或隐藏时对其执行某些操作,您可以使用filter(":visible")filter(":hidden"),然后将其与您要执行的操作链接起来。

所以不是if 声明,像这样:

if ($('#btnUpdate').is(":visible"))
{
     $('#btnUpdate').animate({ width: "toggle" });   // Hide button
}

或者更高效,但更丑:

var button = $('#btnUpdate');
if (button.is(":visible"))
{
     button.animate({ width: "toggle" });   // Hide button
}

您可以在一行中完成所有操作:

$('#btnUpdate').filter(":visible").animate({ width: "toggle" });

【讨论】:

  • 没有理由将示例中使用的sn -p中的DOM节点提取出来,然后必须重新查找它。最好这样做: var $button = $('#btnUpdate');然后在 If 表达式中只使用 $button 而不是 $(button)。有缓存jQuery对象的优点。
  • 这是一个简单的例子jquerypot.com/…
【解决方案5】:

来自How do I determine the state of a toggled element?


您可以使用:visible:hidden 选择器确定元素是否折叠。

var isVisible = $('#myDiv').is(':visible');
var isHidden = $('#myDiv').is(':hidden');

如果您只是根据元素的可见性对其进行操作,则只需在选择器表达式中包含:visible:hidden。例如:

 $('#myDiv:visible').animate({left: '+=200px'}, 'slow');

【讨论】:

  • 想知道为什么没有答案提到元素从可见窗口移开的情况,比如top:-1000px...猜猜这是一个边缘情况
【解决方案6】:

这些答案都没有解决我所理解的问题,即我正在寻找的问题,“我如何处理具有visibility: hidden 的项目?”:visible:hidden 都不会处理这个问题,因为他们都在根据文档寻找显示。据我所知,没有选择器来处理 CSS 可见性。这是我解决它的方法(标准 jQuery 选择器,可能有更简洁的语法):

$(".item").each(function() {
    if ($(this).css("visibility") == "hidden") {
        // handle non visible state
    } else {
        // handle visible state
    }
});

【讨论】:

  • 这个答案很好处理visibility,但问题是How you would test if an element has been hidden or shown using jQuery?。使用 jQuery 意味着:display 属性。
  • 带有visibility: hiddenopacity: 0 的元素被认为是可见的,因为它们仍然占用布局中的空间。请参阅 :visible 选择器上的 answer by Pedro RainhojQuery documentation
  • 你需要向上遍历DOM来检查节点的父节点,否则,这是没有用的。
【解决方案7】:

这对我有用,我正在使用 show()hide() 使我的 div 隐藏/可见:

if( $(this).css('display') == 'none' ){
    /* your code goes here */
} else {
    /* alternate logic   */
}

【讨论】:

    【解决方案8】:

    :visible 选择器根据the jQuery documentation

    • 它们的 CSS display 值为 none
    • 它们是带有type="hidden" 的表单元素。
    • 它们的宽度和高度明确设置为 0。
    • 祖先元素被隐藏,因此该元素不会显示在页面上。

    带有visibility: hiddenopacity: 0 的元素被认为是可见的,因为它们仍然占用布局中的空间。

    这在某些情况下有用而在其他情况下无用,因为如果你想检查元素是否可见(display != none),忽略父母可见性,你会发现做.css("display") == 'none'不仅更快,而且也将正确返回可见性检查。

    如果你想检查可见性而不是显示,你应该使用:.css("visibility") == "hidden"

    还要考虑the additional jQuery notes:

    因为:visible 是一个jQuery 扩展而不是CSS 规范的一部分,所以使用:visible 的查询不能利用原生DOM querySelectorAll() 方法提供的性能提升。要在使用:visible 选择元素时获得最佳性能,请先使用纯 CSS 选择器选择元素,然后使用.filter(":visible")

    另外,如果您担心性能,您应该查看Now you see me… show/hide performance (2010-05-04)。并使用其他方法显示和隐藏元素。

    【讨论】:

      【解决方案9】:

      我会使用 CSS 类 .hide { display: none!important; }

      为了隐藏/显示,我打电话给.addClass("hide")/.removeClass("hide")。为了检查可见性,我使用.hasClass("hide")

      如果您不打算使用.toggle().animate() 方法,这是一种检查/隐藏/显示元素的简单明了的方法。

      【讨论】:

      • .hasClass('hide') 不检查父级的祖先是否隐藏(这也会使其隐藏)。您可以通过检查 .closest('.hide').length &gt; 0 来使其正常工作,但为什么要重新发明轮子呢?
      • 如果元素在 html 上可见,您建议的变体返回,如果元素被您的 javascript 代码/视图引擎直接隐藏,我的变体返回。如果您知道永远不应该隐藏父元素 - 请使用 .hasClass() 更加严格并防止将来出现错误。如果您不仅要检查可见性,还要检查元素状态集 - 也可以使用 .hasClass() 。在其他情况下 .closest() 更好。
      【解决方案10】:

      您应该考虑的另一个答案是,如果您要隐藏一个元素,则应该使用jQuery,但不是实际隐藏它,而是删除整个元素,而是复制其HTML 内容和标签本身进入一个jQuery变量,然后你需要做的就是测试屏幕上是否有这样的标签,使用普通的if (!$('#thetagname').length)

      【讨论】:

        【解决方案11】:

        如何element visibility and jQuery works;

        可以使用display:nonevisibility:hiddenopacity:0 隐藏元素。这些方法之间的区别:

        • display:none隐藏元素,不占空间;
        • visibility:hidden 隐藏了元素,但在布局中仍然占用空间;
        • opacity:0将元素隐藏为“visibility:hidden”,在布局中依然占用空间;唯一的区别是不透明度可以让一个元素部分透明;

          if ($('.target').is(':hidden')) {
            $('.target').show();
          } else {
            $('.target').hide();
          }
          if ($('.target').is(':visible')) {
            $('.target').hide();
          } else {
            $('.target').show();
          }
          
          if ($('.target-visibility').css('visibility') == 'hidden') {
            $('.target-visibility').css({
              visibility: "visible",
              display: ""
            });
          } else {
            $('.target-visibility').css({
              visibility: "hidden",
              display: ""
            });
          }
          
          if ($('.target-visibility').css('opacity') == "0") {
            $('.target-visibility').css({
              opacity: "1",
              display: ""
            });
          } else {
            $('.target-visibility').css({
              opacity: "0",
              display: ""
            });
          }
          

          有用的 jQuery 切换方法:

          $('.click').click(function() {
            $('.target').toggle();
          });
          
          $('.click').click(function() {
            $('.target').slideToggle();
          });
          
          $('.click').click(function() {
            $('.target').fadeToggle();
          });
          

        【讨论】:

        • visibility:hiddenopacity:0 之间的另一个区别是元素仍将使用opacity:0 响应事件(如点击)。我学会了为文件上传制作自定义按钮的技巧。
        • 如果你用 opacity:0 隐藏输入,它仍然会被 Tab 键选中
        【解决方案12】:

        可以简单地使用hiddenvisible 属性,例如:

        $('element:hidden')
        $('element:visible')
        

        或者你可以用 is 将其简化如下。

        $(element).is(":visible")
        

        【讨论】:

          【解决方案13】:

          ebdiv 应设置为style="display:none;"。它适用于显示和隐藏:

          $(document).ready(function(){
              $("#eb").click(function(){
                  $("#ebdiv").toggle();
              });    
          });
          

          【讨论】:

            【解决方案14】:

            您也可以使用纯 JavaScript 来做到这一点:

            function isRendered(domObj) {
                if ((domObj.nodeType != 1) || (domObj == document.body)) {
                    return true;
                }
                if (domObj.currentStyle && domObj.currentStyle["display"] != "none" && domObj.currentStyle["visibility"] != "hidden") {
                    return isRendered(domObj.parentNode);
                } else if (window.getComputedStyle) {
                    var cs = document.defaultView.getComputedStyle(domObj, null);
                    if (cs.getPropertyValue("display") != "none" && cs.getPropertyValue("visibility") != "hidden") {
                        return isRendered(domObj.parentNode);
                    }
                }
                return false;
            }
            

            注意事项:

            1. 无处不在

            2. 适用于嵌套元素

            3. 适用于 CSS 和内联样式

            4. 不需要框架

            【讨论】:

            • 工作方式与 jQuery 略有不同;它认为visibility: hidden 可见
            • 更改上面的代码来模仿(可以说是愚蠢的)jQuery 行为很容易。 . . . . function isRendered(o){if((o.nodeType!=1)||(o==document.body)){return true;}if(o.currentStyle&&o.currentStyle["display"]!="none") {return isRendered(o.parentNode);}else if(window.getComputedStyle){if(document.defaultView.getComputedStyle(o, null).getPropertyValue("display")!="none"){return isRendered(o.parentNode );}}return false;}
            • 当然,我只是为了方便使用它而不扫描其代码的用户而添加它。 :)
            【解决方案15】:
            expect($("#message_div").css("display")).toBe("none");
            

            【讨论】:

              【解决方案16】:

              Demo Link

              $('#clickme').click(function() {
                $('#book').toggle('slow', function() {
                  // Animation complete.
                  alert($('#book').is(":visible")); //<--- TRUE if Visible False if Hidden
                });
              });
              <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
              <div id="clickme">
                Click here
              </div>
              <img id="book" src="https://upload.wikimedia.org/wikipedia/commons/8/87/Google_Chrome_icon_%282011%29.png" alt="" width="300"/>

              来源(来自我的博客):

              Blogger Plug n Play - jQuery Tools and Widgets: How to See if Element is hidden or Visible Using jQuery

              【讨论】:

              • @Adrew 但此链接显示此功能的工作示例。我认为一个实用的答案可能会超过一整页的文字:)
              【解决方案17】:

              要检查它是否不可见,我使用!:

              if ( !$('#book').is(':visible')) {
                  alert('#book is not visible')
              }
              

              或者下面也是sam,将jQuery选择器保存在一个变量中,以便在多次需要时有更好的性能:

              var $book = $('#book')
              
              if(!$book.is(':visible')) {
                  alert('#book is not visible')
              }
              

              【讨论】:

              • 您如何确定将选择器保存在变量中真的更快?
              • 嗨@Ilia Rostovtsev jsperf.com/caching-jquery-selectors 你可以在那里运行测试。无论如何,最好将其缓存起来,以便更快地访问它
              • 如果您想在整个过程中使用单个变量而不是调用和调用同一个对象,这很适合。
              【解决方案18】:

              使用类切换,而不是样式编辑。 . .

              使用为“隐藏”元素指定的类很容易,也是最有效的方法之一。使用Display 样式为“无”切换“隐藏”类将比直接编辑该样式执行得更快。我在 Stack Overflow 问题 Turning two elements visible/hidden in the same div 中非常彻底地解释了其中的一些内容。


              JavaScript 最佳实践和优化

              以下是 Google 前端工程师 Nicholas Zakas 的 Google 技术讲座的真正启发性视频:

              【讨论】:

                【解决方案19】:

                $(document).ready(function() {
                  if ($("#checkme:hidden").length) {
                    console.log('Hidden');
                  }
                });
                <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
                <div id="checkme" class="product" style="display:none">
                  <span class="itemlist"><!-- Shows Results for Fish --></span> Category:Fish
                  <br>Product: Salmon Atlantic
                  <br>Specie: Salmo salar
                  <br>Form: Steaks
                </div>

                【讨论】:

                  【解决方案20】:

                  这里还有一个三元条件表达式来检查元素的状态,然后切换它:

                  $('someElement').on('click', function(){ $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); });
                  

                  【讨论】:

                  • 或者,你知道,把整个条件去掉然后说$('elementToToggle').toggle('slow');...:)
                  【解决方案21】:
                  if($('#postcode_div').is(':visible')) {
                      if($('#postcode_text').val()=='') {
                          $('#spanPost').text('\u00a0');
                      } else {
                          $('#spanPost').text($('#postcode_text').val());
                  }
                  

                  【讨论】:

                    【解决方案22】:

                    您需要同时检查...显示和可见性:

                    if ($(this).css("display") == "none" || $(this).css("visibility") == "hidden") {
                        // The element is not visible
                    } else {
                        // The element is visible
                    }
                    

                    如果我们检查$(this).is(":visible"),jQuery 会自动检查这两个东西。

                    【讨论】:

                      【解决方案23】:

                      因为Elements with visibility: hidden or opacity: 0 are considered visible, since they still consume space in the layout(如jQuery :visible Selector 所述) - 我们可以通过这种方式检查元素是否真的可见:

                      function isElementReallyHidden (el) {
                          return $(el).is(":hidden") || $(el).css("visibility") == "hidden" || $(el).css('opacity') == 0;
                      }
                      
                      var booElementReallyShowed = !isElementReallyHidden(someEl);
                      $(someEl).parents().each(function () {
                          if (isElementReallyHidden(this)) {
                              booElementReallyShowed = false;
                          }
                      });
                      

                      【讨论】:

                        【解决方案24】:

                        毕竟没有一个例子适合我,所以我自己写了。

                        测试(不支持 Internet Explorer filter:alpha):

                        a) 检查文档是否未被隐藏

                        b) 检查元素是否具有零宽度/高度/不透明度或内联样式中的display:none/visibility:hidden

                        c)检查元素的中心(也因为它比测试每个像素/角更快)是否没有被其他元素(以及所有祖先,例如:overflow:hidden/滚动/一个元素覆盖另一个元素)或屏幕隐藏边缘

                        d) 检查元素是否具有零宽度/高度/不透明度或display:none/可见性:隐藏在计算样式中(在所有祖先中)

                        测试于

                        Android 4.4 (Native browser/Chrome/Firefox), Firefox (Windows/Mac), Chrome (Windows/Mac), Opera (Windows Presto/Mac WebKit), Internet Explorer (Internet Explorer 5-11 文档模式 +虚拟机上的 Internet Explorer 8)和 Safari(Windows/Mac/iOS)。

                        var is_visible = (function () {
                            var x = window.pageXOffset ? window.pageXOffset + window.innerWidth - 1 : 0,
                                y = window.pageYOffset ? window.pageYOffset + window.innerHeight - 1 : 0,
                                relative = !!((!x && !y) || !document.elementFromPoint(x, y));
                                function inside(child, parent) {
                                    while(child){
                                        if (child === parent) return true;
                                        child = child.parentNode;
                                    }
                                return false;
                            };
                            return function (elem) {
                                if (
                                    document.hidden ||
                                    elem.offsetWidth==0 ||
                                    elem.offsetHeight==0 ||
                                    elem.style.visibility=='hidden' ||
                                    elem.style.display=='none' ||
                                    elem.style.opacity===0
                                ) return false;
                                var rect = elem.getBoundingClientRect();
                                if (relative) {
                                    if (!inside(document.elementFromPoint(rect.left + elem.offsetWidth/2, rect.top + elem.offsetHeight/2),elem)) return false;
                                } else if (
                                    !inside(document.elementFromPoint(rect.left + elem.offsetWidth/2 + window.pageXOffset, rect.top + elem.offsetHeight/2 + window.pageYOffset), elem) ||
                                    (
                                        rect.top + elem.offsetHeight/2 < 0 ||
                                        rect.left + elem.offsetWidth/2 < 0 ||
                                        rect.bottom - elem.offsetHeight/2 > (window.innerHeight || document.documentElement.clientHeight) ||
                                        rect.right - elem.offsetWidth/2 > (window.innerWidth || document.documentElement.clientWidth)
                                    )
                                ) return false;
                                if (window.getComputedStyle || elem.currentStyle) {
                                    var el = elem,
                                        comp = null;
                                    while (el) {
                                        if (el === document) {break;} else if(!el.parentNode) return false;
                                        comp = window.getComputedStyle ? window.getComputedStyle(el, null) : el.currentStyle;
                                        if (comp && (comp.visibility=='hidden' || comp.display == 'none' || (typeof comp.opacity !=='undefined' && comp.opacity != 1))) return false;
                                        el = el.parentNode;
                                    }
                                }
                                return true;
                            }
                        })();
                        

                        使用方法:

                        is_visible(elem) // boolean
                        

                        【讨论】:

                          【解决方案25】:
                          .is(":not(':hidden')") /*if shown*/
                          

                          【讨论】:

                          • 因为 :not(':hidden') 和 is(':visible') 不一样。 “可见”适用于 css“不透明度”而不适用于 JQuery“show()/hide()”。另外,没有额外的报价。每个集合都在这个小代码中发挥作用。
                          • 1) :visible:hidden 检查 CSS 元素和祖先可见性,而不仅仅是您现在建议的 display: none。 2) 如果选择器仅包含 : 和字母数字,则 在伪选择器内 不需要引号(例如,:not(:hidden)not(':hidden') 相同(仅快一点)和3)如果你不能接受你有时可能实际上是不正确的,你将如何变得更好? :)
                          【解决方案26】:

                          在 jQuery 中针对:hidden 选择器测试元素时,应考虑绝对定位元素可能被识别为隐藏,尽管其子元素可见

                          这似乎有点违反直觉——尽管仔细查看 jQuery 文档会得到相关信息:

                          元素可以被认为是隐藏的有几个原因:[...]它们的宽度和高度被明确设置为 0。[...]

                          所以这对于盒子模型和元素的计算样式来说实际上是有意义的。即使宽度和高度没有显式设置为0,它们也可以隐式设置。

                          看看下面的例子:

                          console.log($('.foo').is(':hidden')); // true
                          console.log($('.bar').is(':hidden')); // false
                          .foo {
                            position: absolute;
                            left: 10px;
                            top: 10px;
                            background: #ff0000;
                          }
                          
                          .bar {
                            position: absolute;
                            left: 10px;
                            top: 10px;
                            width: 20px;
                            height: 20px;
                            background: #0000ff;
                          }
                          <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
                          <div class="foo">
                            <div class="bar"></div>
                          </div>

                          jQuery 3.x 更新:

                          使用 jQuery 3,所描述的行为将会改变!如果元素有任何布局框(包括零宽度和/或高度的布局框),则元素将被视为可见。

                          JSFiddle 与 jQuery 3.0.0-alpha1:

                          http://jsfiddle.net/pM2q3/7/

                          相同的 JavaScript 代码将具有以下输出:

                          console.log($('.foo').is(':hidden')); // false
                          console.log($('.bar').is(':hidden')); // false
                          

                          【讨论】:

                            【解决方案27】:

                            通过检查布尔值来检查可见性,例如:

                            if (this.hidden === false) {
                                // Your code
                            }
                            

                            我对每个函数都使用了这段代码。否则,您可以使用is(':visible') 来检查元素的可见性。

                            【讨论】:

                              【解决方案28】:

                              但是如果元素的 CSS 如下所示呢?

                              .element{
                                  position: absolute;left:-9999;    
                              }
                              

                              所以this answer to Stack Overflow question How to check if an element is off-screen 也应该考虑。

                              【讨论】:

                                【解决方案29】:

                                可以创建一个函数来检查可见性/显示属性,以判断元素是否显示在 UI 中。

                                function checkUIElementVisible(element) {
                                    return ((element.css('display') !== 'none') && (element.css('visibility') !== 'hidden'));
                                }
                                

                                Working Fiddle

                                【讨论】:

                                  【解决方案30】:

                                  $(document).ready(function() {
                                     var visible = $('#tElement').is(':visible');
                                  
                                     if(visible) {
                                        alert("visible");
                                                      // Code
                                     }
                                     else
                                     {
                                        alert("hidden");
                                     }
                                  });
                                  <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
                                  
                                  <input type="text" id="tElement" style="display:block;">Firstname</input>

                                  【讨论】:

                                    猜你喜欢
                                    • 2010-09-15
                                    相关资源
                                    最近更新 更多