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


7736

是否有可能切换元素的可见性,使用功能.hide().show().toggle()

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


49
值得一提的是(即使一直如此),它$(element).is(":visible")适用于Internet Explorer 8下的jQuery 1.4.4,但不适用于jQuery 1.3.2 。可以使用Tsvetomir Tsonev的有用测试片段进行测试。只要记住要更改jQuery的版本,并在每个版本下进行测试即可。
Reuben

2
:这虽然是不同的问题相关stackoverflow.com/questions/17425543/...
马克Schultheiss

Answers:


9393

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

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

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

它与twernt的建议相同,但适用于单个元素。它与jQuery FAQ中推荐的算法匹配

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


164
该解决方案似乎鼓励的confustion visible=falsedisplay:none; 而Mote的解决方案显然使编码人员无法检查代码display:none;(通过提到隐藏和显示哪个控件display:none没有控制visible=true
kralco626

93
正确,但是:visible也将检查父元素是否可见,如chiborg指出的那样。
茨韦托米尔·特松涅夫2011年

45
您有一个要点-我将明确指出代码仅检查该display属性。鉴于最初的问题是show()hide(),并且它们已设置display,我的回答是正确的。通过它与IE7兼容的方式,这是一个测试代码段-jsfiddle.net/MWZss ;
Tsvetomir Tsonev 2011年

53
实际上,我发现反向逻辑词更好:!$('selector')。is(':hidden'); 由于某些原因。值得一试。
Kzqai 2012年

21
这是一个针对regexp的简单基准测试is():jsperf.com/jquery-is-vs-regexp-for-css-visibility。结论:如果您出于性能考虑,请在is()上使用regexp(因为is()在查看实际元素之前先查找所有隐藏节点)。
Max Leske 2012年

1457

您可以使用hidden选择器:

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

visible选择器:

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

67
请注意,本演示文稿中有一些与性能相关的技巧:addyosmani.com/jqprovenperformance
codecraig 2011年

27
在第21至28页上,它显示了:hidden或:visible与其他选择器相比有多慢。感谢您指出这一点。
Etienne Dupuis,2012年

109
当您处理几个要素时,几乎没有发生任何事情(即,案例数量惊人),时间问题是一个非常可笑的小问题。哦,不!花了42毫秒而不是19毫秒!!!
vbullinger

16
我正在使用此选择器在元素上进行切换。$('element:hidden')对我永远都是正确的!
ZoomIn

15
@cwingrav您可能想重新阅读文档,:hidden适用于所有元素。具有的表单元素type="hidden"只是一种可能触发:hidden的情况。没有高度和宽度的元素,具有的display: none元素以及具有隐藏祖先的元素也将被视为:hidden。
约书亚·沃尔什

948
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将不起作用。


131
这仅检查单个元素的显示属性。:visible属性还检查父元素的可见性。
Chiborg'3

16
这仅仅是与IE 8测试时为我工作的解决方案
evanmcd

20
@chiborg是的,但是有时候这就是您想要的,我不得不学习如何“巧妙地”使用jQuery的艰难方法……
Casey 2014年

9
这确实回答这个问题,是问题是关于一个单一的元素,通过使用hide()show()toggle()功能,但是,因为大多数已经说过,我们应该使用:visible:hidden伪类。
Jimmy Knoot 2015年

2
当元素存在但当前不在页面上时(例如在detach()之后),可以使用此答案。
atheaos

526

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

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

18
visibility从字面上看这个答案很好,但是问题是How you would test if an element has been hidden or shown using jQuery?。使用jQuery意味着:display属性。
MarioDS

10
带有visibility: hidden或的元素opacity: 0被视为可见,因为它们仍然占用布局中的空间。请参阅Pedro RainhojQuery文档的答案:visible选择器上的。
敬畏

9
您需要遍历DOM来检查节点的父节点,否则,这是没有用的。
vsync

389

我如何确定一个切换元件的状态?


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

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

如果您只是基于某个元素的可见性对其进行操作,则可以在选择符表达式中包含:visible:hidden。例如:

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

4
想知道为什么没有答案提到将元素从可见窗口移开的情况,例如top:-1000px...猜猜这是一个边缘情况
jazzcat

294

通常,当检查是否可见时,您将立即前进并对其进行其他处理。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" });

25
没有理由在示例中使用的代码段中提取DOM节点,然后必须再次对其进行备份。更好地做:var $ button = $('#btnUpdate'); 然后在If表达式中,仅使用$ button代替$(button)。具有缓存jQuery对象的优势。
LocalPCGuy 2012年

1
这里有一个简单的例子jquerypot.com/...
科坦Savaliya

241

:visible根据jQuery文档的选择器:

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

带有visibility: hidden或的元素opacity: 0被视为可见,因为它们仍然占用布局中的空间。

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

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

还请考虑其他jQuery注释

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

另外,如果您担心性能,则应选中“ 现在您可以看到我…显示/隐藏性能”(2010-05-04)。并使用其他方法来显示和隐藏元素。


213

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

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

212

元素可见性和jQuery是如何工作的 ;

一个元素可以与被隐藏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();
    });

20
visibility:hidden和之间的另一个区别opacity:0是元素仍将通过响应事件(例如点击)opacity:0。我了解了为文件上传创建自定义按钮的技巧。
urraka 2012年

1
另外,如果您隐藏不透明度为0的输入,则仍可以使用Tab键选择它
YangombiUmpakati 17-12-12

160

您也可以使用普通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. 不需要框架


6
与jQuery的工作方式略有不同;它认为visibility: hidden可见的
alex 2012年

4
更改上面的代码以模仿(可以说是愚蠢的)jQuery行为很容易。。。。。函数isRendered(o){if(((o.nodeType!= 1)|||(o == document.body))} {返回true;} if(o.currentStyle && o.currentStyle [“ display”]!=“ none”) {return isRendered(o.parentNode);}否则if(window.getComputedStyle){if(document.defaultView.getComputedStyle(o,null).getPropertyValue(“ display”)!=“ none”){return isRendered(o.parentNode) );}}返回false;}
Matt Brock 2012年

3
当然,我只是为了使使用它而无需扫描其代码的用户受益。:)
alex 2012年

160

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

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

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


11
.hasClass('hide')不会检查父项的祖先是否被隐藏(也将其隐藏)。您可以通过检查是否可以使它正常工作.closest('.hide').length > 0,但是为什么要重新发明轮子呢?
nbrooks 2012年

1
如果元素在html上可见,则您建议的变体返回,如果javascript代码/视图引擎直接隐藏了元素,则我的变体返回。如果您知道父元素永远都不应被隐藏,请使用.hasClass()使其更加严格,并防止将来出现错误。如果您不仅要检查可见性,还要检查元素状态设置,请也使用.hasClass()。在其他情况下,.closest()更好。
Evgeny Levin

1
为什么不只使用.is(“:visible”)?
dont_trust_me 18-10-16

137

演示链接

$('#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即插即用-jQuery工具和小部件:如何使用jQuery查看元素是否隐藏或可见


1
@Adrew,但此链接显示此功能的工作示例。我认为实际的答案可能会占整个文本的重量:)
代码间谍(Spy)2013年

133

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

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

或者你也可以简化与相同IS如下。

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

130

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

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

118

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


99

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

首先,这似乎有点违反直觉–尽管仔细查看jQuery文档会提供相关信息:

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

因此,这对于盒模型和元素的计算样式实际上是有意义的。即使没有将width和height 显式设置为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,描述的行为将改变!如果元素具有任何布局框,包括宽度和/或高度为零的布局框,则它们将被视为可见。

带有jQuery 3.0.0-alpha1的JSFiddle:

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

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

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


74

例:

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


66

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

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

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

var $book = $('#book')

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

1
您如何确定将选择器保存在变量中确实更快?
Ilia Rostovtsev

3
嗨,@ Ilia Rostovtsev jsperf.com/caching-jquery-selectors您可以在此处运行测试。无论如何,最好将其缓存,以便可以更快地访问它
Matthias Wegtun

2
如果要在整个过程中使用单个变量,而不是调用和调用同一对象,则此方法很合适。
肯尼斯·帕拉加纳斯

60

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

使用为“隐藏”元素指定的类很容易,也是最有效的方法之一。将Display样式“隐藏”的类切换为“无”样式将比直接编辑该样式更快。我在“堆栈溢出”问题中相当详尽地解释了其中的一些问题,即在同一个div中将两个元素变为可见/隐藏状态


JavaScript最佳做法和优化

这是Google前端工程师Nicholas Zakas进行的Google技术讲座的真正令人启发的视频:


60

激活了对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是否已打开。


58

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

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

a)检查文件是否未隐藏

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

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

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

经过测试

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 on a虚拟机)和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

50

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

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

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


41

也许你可以做这样的事情

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


37

只需检查布尔值即可检查可见性,例如:

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

我为每个功能使用了此代码。否则,您可以is(':visible')用于检查元素的可见性。


34

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

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;
    }
});


30

可以创建一个功能来检查可见性/显示属性,以便确定元素是否显示在UI中。

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

工作小提琴


29

另外,这里是一个三元条件表达式,用于检查元素的状态然后进行切换:

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

4
或者,y'kno,只是摆脱整个条件,然后说$('elementToToggle').toggle('slow');……:)
nbrooks 2013年

29
if($('#postcode_div').is(':visible')) {
    if($('#postcode_text').val()=='') {
        $('#spanPost').text('\u00a0');
    } else {
        $('#spanPost').text($('#postcode_text').val());
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.