首页 文章

如何检查jQuery中是否隐藏了一个元素?

提问于
浏览
6962

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

如何测试元素是可见还是隐藏?

30 回答

  • 102

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

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

    或者你可以简化相同的如下 .

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

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

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

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

  • 37

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

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

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

  • 473

    您可以使用hidden选择器:

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

    visible选择器:

    // Matches all elements that are visible
    $('element:visible')
    
  • 58
    $('#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="http://www.chromefusion.com/wp-content/uploads/2012/06/chrome-logo.jpg" alt="" />
    

    Source:

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

    jsFiddle:

    JSFiddle - ipsjolly - k4WWj

  • 29

    这可能有效:

    expect($("#message_div").css("display")).toBe("none");
    
  • 144

    来自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');
    
  • 139

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

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

    在jQuery中针对 :hidden 选择器测试元素时,应该将其视为 an absolute positioned element may be recognized as hidden although their child elements are visible .

    这看起来有点违反直觉 - 尽管仔细查看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>
    

    UPDATE FOR JQUERY 3.x:

    使用jQuery 3,所描述的行为将发生变化!如果元素具有任何布局框,包括零宽度和/或高度的布局框,则将其视为可见元素 .

    JSFiddle与jQuery 3.0.0-alpha1:

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

    然后,相同的JS将具有此输出:

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

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

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

    例:

    $(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>
    
  • 829

    如何 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: ""
      });
    }
    

    Useful jQuery toggle methods:

    $('.click').click(function() {
      $('.target').toggle();
    });
    
    $('.click').click(function() {
      $('.target').slideToggle();
    });
    
    $('.click').click(function() {
      $('.target').fadeToggle();
    });
    
  • 1316
    if($('#postcode_div').is(':visible')) {
        if($('#postcode_text').val()=='') {
            $('#spanPost').text('\u00a0');
        } else {
            $('#spanPost').text($('#postcode_text').val());
    }
    
  • 28

    通常在检查某些东西是否可见时,您将立即前进并使用它做其他事情 . 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" });
    
  • 31

    根据the jQuery documentation:visible 选择器:

    它们的CSS显示值为none . 它们是type =“hidden”的表单元素 . 它们的宽度和高度显式设置为0.隐藏祖先元素,因此页面上不显示该元素 . 具有可见性的元素:隐藏或不透明度:0被认为是可见的,因为它们仍然占用布局中的空间 .

    这在某些情况下很有用,而在其他情况下则无用,因为如果要检查元素是否可见( display != none ),忽略父项可见性,您会发现执行 .css("display") == 'none' 不仅更快,而且还会正确返回可见性检查 .

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

    还要考虑the additional jQuery notes

    因为:visible是一个jQuery扩展而不是CSS规范的一部分,使用:visible的查询无法利用本机DOM querySelectorAll()方法提供的性能提升 . 要在使用时获得最佳性能:可见选择元素,首先使用纯CSS选择器选择元素,然后使用.filter(“:visible”) .

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

  • 54

    你需要检查两个......显示和可见性:

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

    如果我们检查 $(this).is(":visible") ,jQuery自动检查这两件事 .

  • 84

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

  • 252

    这适用于我,我使用 show()hide() 使我的div隐藏/可见:

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

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

    Tests (不支持Internet Explorer filter:alpha ):

    a)检查文档是否未隐藏

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

    c)检查元素的中心(也因为它比测试每个像素/角更快)是否被其他元素(和所有祖先,例如: overflow:hidden / scroll / one element over theother)或屏幕边缘隐藏

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

    Tested on

    Android 4.4(原生浏览器/ 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
    
  • 29

    也许你可以做这样的事情

    $(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>
    
  • 342

    激活使用 visible 检查adblocker的示例:

    $(document).ready(function(){
      if(!$("#ablockercheck").is(":visible"))
        $("#ablockermsg").text("Please disable adblocker.").show();
    });
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="ad-placement" id="ablockercheck"></div>
    <div id="ablockermsg" style="display: none"></div>
    

    “ablockercheck”是adblocker阻止的ID . 因此,检查它是否可见,您可以检测adblocker是否已打开 .

  • 8590

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

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

    它's a simple and clear way to check/hide/show elements, if you don'计划使用 .toggle().animate() 方法 .

  • 104
    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可见而:可见不可见 . 但是在许多情况下,上述内容可能很有用,尤其是当您需要查找隐藏父级中是否有任何错误div时,因为在这种情况下:visible不起作用 .

  • 119

    ebdiv 应设置为 style="display:none;" . 它适用于show和hide:

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

    可以创建函数以检查可见性/显示属性,以便衡量元素是否在UI中显示 .

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

    Working Fiddle

  • 54

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

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

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

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

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

    使用为"hiding"元素指定的类很容易,也是最有效的方法之一 . 使用 Display 样式的'none'切换类'hidden'将比直接编辑该样式执行得更快 . 我在Stack Overflow问题Turning two elements visible/hidden in the same div中详细解释了一些 .


    JavaScript最佳实践和优化

    以下是Google前端工程师Nicholas Zakas撰写的Google Tech Talk的真实启发视频:

    • Speed Up Your Javascript (YouTube)
  • 28

    因为 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;
        }
    });
    
  • 186

    您也可以使用纯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;
    }
    

    笔记:

    • 无处不在

    • 适用于嵌套元素

    • 适用于CSS和内联样式

    • 不需要框架

  • 180

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

    // Checks css 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

相关问题