如何检查一个元素是不是隐藏在 jQuery 中?
Posted
技术标签:
【中文标题】如何检查一个元素是不是隐藏在 jQuery 中?【英文标题】:How do I check if an element is hidden in jQuery?如何检查一个元素是否隐藏在 jQuery 中? 【发布时间】:2010-09-15 18:04:25 【问题描述】:是否可以使用函数.hide()
、.show()
或.toggle()
来切换元素的可见性?
如何测试一个元素是visible
还是hidden
?
【问题讨论】:
值得一提(即使经过这么长时间),$(element).is(":visible")
适用于 jQuery 1.4.4,但不适用于 jQuery 1.3.2,在 Internet Explorer 8 下。这可以使用Tsvetomir Tsonev's helpful test snippet 进行测试。只要记住改变jQuery的版本,在每一个下测试。
这是相关的,尽管问题不同:***.com/questions/17425543/…
如果您对隐藏虚拟 css 元素不感兴趣,但对用户在“视口区域”中的物理可见性不感兴趣,请考虑查看 ***.com/questions/487073/… 和 ***.com/questions/123999/…
【参考方案1】:
由于问题涉及单个元素,因此此代码可能更合适:
// 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=false
和display:none
;而 Mote 的解决方案清楚地说明了编码人员检查display:none
的意图; (通过提及隐藏和显示哪个控件display:none
而不是visible=true
)
没错,但正如 chiborg 所指出的,:visible
也会检查父元素是否可见。
您说得有道理 - 我会明确表示代码仅检查 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() 在查看实际元素之前先查找所有隐藏节点)。【参考方案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】:
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() 之后。【参考方案4】:
这些答案都没有解决我所理解的问题,即我正在寻找的问题,“我如何处理具有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: hidden
或opacity: 0
的元素被认为是可见的,因为它们仍然占用布局中的空间。请参阅 :visible
选择器上的 answer by Pedro Rainho 和 jQuery documentation。
你需要向上遍历DOM来检查节点的父节点,否则,这是没有用的。【参考方案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】:
通常在检查某些东西是否可见时,您会立即继续并用它做其他事情。 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/…【参考方案7】::visible
选择器根据the jQuery documentation:
它们的 CSSdisplay
值为none
。 它们是带有type="hidden"
的表单元素。 它们的宽度和高度明确设置为 0。 祖先元素被隐藏,因此该元素不会显示在页面上。带有
visibility: hidden
或opacity: 0
的元素被认为是可见的,因为它们仍然占用布局中的空间。
这在某些情况下有用而在其他情况下无用,因为如果你想检查元素是否可见(display != none
),忽略父母可见性,你会发现做.css("display") == 'none'
不仅更快,而且也将正确返回可见性检查。
如果你想检查可见性而不是显示,你应该使用:.css("visibility") == "hidden"
。
还要考虑the additional jQuery notes:
因为
:visible
是一个jQuery 扩展而不是CSS 规范的一部分,所以使用:visible
的查询不能利用原生DOMquerySelectorAll()
方法提供的性能提升。要在使用:visible
选择元素时获得最佳性能,请先使用纯 CSS 选择器选择元素,然后使用.filter(":visible")
。
另外,如果您担心性能,您应该查看Now you see me… show/hide performance (2010-05-04)。并使用其他方法显示和隐藏元素。
【讨论】:
【参考方案8】:如何element visibility and jQuery works;
可以使用display:none
、visibility:hidden
或opacity: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:hidden
和opacity:0
之间的另一个区别是元素仍将使用opacity:0
响应事件(如点击)。我学会了为文件上传制作自定义按钮的技巧。
如果你用 opacity:0 隐藏输入,它仍然会被 Tab 键选中【参考方案9】:
这对我有用,我正在使用 show()
和 hide()
使我的 div 隐藏/可见:
if( $(this).css('display') == 'none' )
/* your code goes here */
else
/* alternate logic */
【讨论】:
【参考方案10】:您也可以使用纯 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 和内联样式
不需要框架
【讨论】:
工作方式与 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;
当然,我只是为了方便使用它而不扫描其代码的用户而添加它。 :)【参考方案11】:
我会使用 CSS 类 .hide display: none!important;
。
为了隐藏/显示,我打电话给.addClass("hide")/.removeClass("hide")
。为了检查可见性,我使用.hasClass("hide")
。
如果您不打算使用.toggle()
或.animate()
方法,这是一种检查/隐藏/显示元素的简单明了的方法。
【讨论】:
.hasClass('hide')
不检查父级的祖先是否隐藏(这也会使其隐藏)。您可以通过检查 .closest('.hide').length > 0
来使其正常工作,但为什么要重新发明***呢?
如果元素在 html 上可见,您建议的变体返回,如果元素被您的 javascript 代码/视图引擎直接隐藏,我的变体返回。如果您知道永远不应该隐藏父元素 - 请使用 .hasClass() 更加严格并防止将来出现错误。如果您不仅要检查可见性,还要检查元素状态集 - 也可以使用 .hasClass() 。在其他情况下 .closest() 更好。【参考方案12】:
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" />
来源(来自我的博客):
Blogger Plug n Play - jQuery Tools and Widgets: How to See if Element is hidden or Visible Using jQuery
【讨论】:
@Adrew 但此链接显示此功能的工作示例。我认为一个实用的答案可能会超过一整页的文字:)【参考方案13】:可以简单地使用hidden
或visible
属性,例如:
$('element:hidden')
$('element:visible')
或者你可以用 is 将其简化如下。
$(element).is(":visible")
【讨论】:
【参考方案14】:ebdiv
应设置为 style="display:none;"
。它适用于显示和隐藏:
$(document).ready(function()
$("#eb").click(function()
$("#ebdiv").toggle();
);
);
【讨论】:
【参考方案15】:您应该考虑的另一个答案是,如果您要隐藏一个元素,则应该使用jQuery,但不是实际隐藏它,而是删除整个元素,而是复制其HTML 内容和标签本身进入一个jQuery变量,然后你需要做的就是测试屏幕上是否有这样的标签,使用普通的if (!$('#thetagname').length)
。
【讨论】:
【参考方案16】:在 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
【讨论】:
【参考方案17】:expect($("#message_div").css("display")).toBe("none");
【讨论】:
【参考方案18】:$(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>
【讨论】:
【参考方案19】:要检查它是否不可见,我使用!
:
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 你可以在那里运行测试。无论如何,最好将其缓存起来,以便更快地访问它 如果您想在整个过程中使用单个变量而不是调用和调用同一个对象,这很适合。【参考方案20】:使用类切换,而不是样式编辑。 . .
使用为“隐藏”元素指定的类很容易,也是最有效的方法之一。使用Display
样式为“无”切换“隐藏”类将比直接编辑该样式执行得更快。我在 Stack Overflow 问题 Turning two elements visible/hidden in the same div 中非常彻底地解释了其中的一些内容。
JavaScript 最佳实践和优化
以下是 Google 前端工程师 Nicholas Zakas 的 Google 技术讲座的真正启发性视频:
Speed Up Your Javascript (YouTube)【讨论】:
【参考方案21】:使用可见检查广告拦截器的示例:
$(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”是广告拦截器拦截的 ID。因此,检查它是否可见,您可以检测广告拦截器是否已打开。
【讨论】:
【参考方案22】:毕竟没有一个例子适合我,所以我自己写了。
测试(不支持 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
【讨论】:
【参考方案23】:您需要同时检查...显示和可见性:
if ($(this).css("display") == "none" || $(this).css("visibility") == "hidden")
// The element is not visible
else
// The element is visible
如果我们检查$(this).is(":visible")
,jQuery 会自动检查这两个东西。
【讨论】:
【参考方案24】:$(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>
【讨论】:
【参考方案25】:通过检查布尔值来检查可见性,例如:
if (this.hidden === false)
// Your code
我对每个函数都使用了这段代码。否则,您可以使用is(':visible')
来检查元素的可见性。
【讨论】:
【参考方案26】:因为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;
);
【讨论】:
【参考方案27】:但是如果元素的 CSS 如下所示呢?
.element
position: absolute;left:-9999;
所以this answer to Stack Overflow question How to check if an element is off-screen也应该考虑。
【讨论】:
【参考方案28】:可以创建一个函数来检查可见性/显示属性,以判断元素是否显示在 UI 中。
function checkUIElementVisible(element)
return ((element.css('display') !== 'none') && (element.css('visibility') !== 'hidden'));
Working Fiddle
【讨论】:
【参考方案29】:这里还有一个三元条件表达式来检查元素的状态,然后切换它:
$('someElement').on('click', function() $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); );
【讨论】:
或者,你知道,把整个条件去掉,然后说$('elementToToggle').toggle('slow');
...:)
【参考方案30】:
if($('#postcode_div').is(':visible'))
if($('#postcode_text').val()=='')
$('#spanPost').text('\u00a0');
else
$('#spanPost').text($('#postcode_text').val());
【讨论】:
以上是关于如何检查一个元素是不是隐藏在 jQuery 中?的主要内容,如果未能解决你的问题,请参考以下文章