如何检查一个元素是否隐藏在jQuery中?
可以使用函数.show()
.toggle()
.show()
或.toggle()
来切换元素的可见性。
你如何testing一个元素是否可见或隐藏?
由于该问题涉及单个元素,因此该代码可能更合适:
// Checks for display:[none|block], ignores visible:[true|false] $(element).is(":visible");
与twernt的build议相同,但适用于单一元素; 它与jQuery FAQ中推荐的algorithm相匹配
您可以使用hidden
select器:
// Matches all elements that are hidden $('element:hidden')
而visible
select器:
// Matches all elements that are visible $('element:visible')
if ( $(element).css('display') == 'none' ){ // element is hidden }
函数不能使用可见性属性。
这些答案都没有解决我所理解的问题,这正是我所寻找的问题: “我如何处理具有visibility: hidden
项目visibility: hidden
? 。 既不:visible
也不:hidden
会处理这个,因为他们都在寻找显示每个文档。 据我所知,没有select器来处理CSS可见性。 下面是我如何解决它(标准的jQueryselect器,可能有一个更简洁的语法):
$(".item").each(function() { if ($(this).css("visibility") == "hidden") { // handle non visible state } else { // handle visible state } });
从我如何确定切换元素的状态?
您可以使用:visible
和:hidden
select器来确定元素是否被折叠。
var isVisible = $('#myDiv').is(':visible'); var isHidden = $('#myDiv').is(':hidden');
如果您只是基于其可见性对元素进行操作,则可以在select器expression式中包含:visible
或:hidden
。 例如:
$('#myDiv:visible').animate({left: '+=200px'}, 'slow');
通常当检查是否有可见的东西时,你会立刻马上进行,并做一些其他的事情。 jQuery链接使得这很容易。
所以,如果你有一个select器,并且只有在可见或隐藏的情况下才想对其执行某些操作,则可以使用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" });
根据jQuery文档 : :visible
select器:
- 他们的CSS
display
值为none
。- 它们是
type="hidden"
表单元素。- 它们的宽度和高度显式设置为0。
- 祖先元素是隐藏的,所以元素不会显示在页面上。
具有
visibility: hidden
元素visibility: hidden
或opacity: 0
被认为是可见的,因为它们仍然占用布局中的空间。
这在某些情况下是有用的,而在其他情况下是无用的,因为如果你想检查元素是否可见( display != none
),忽略父母的可见性,你会发现做.css("display") == 'none'
不仅更快,而且还会正确返回可见性检查。
如果你想检查可见性而不是显示,你应该使用: .css("visibility") == "hidden"
。
还要考虑附加的jQuery笔记 :
因为
:visible
是一个jQuery扩展,而不是CSS规范的一部分,使用:visible
查询不能利用本地DOMquerySelectorAll()
方法提供的性能提升。 要在使用时达到最佳性能:visible
对于select元素:visible
,请首先使用纯CSSselect器select元素,然后使用.filter(":visible")
。
另外,如果你关心performance,你应该检查现在你看我…显示/隐藏performance (2010-05-04)。 并使用其他方法来显示和隐藏元素。
这适用于我,我使用show()
和hide()
使我的div隐藏/可见:
if( $(this).css('display') == 'none' ){ /* your code goes here */ } else { /* alternate logic */ }
元素可见性和jQuery如何工作 ;
一个元素可以隐藏display:none
, visibility:hidden
或opacity:0
。 这些方法之间的区别:
-
display:none
隐藏元素,并且不占用任何空间; -
visibility:hidden
隐藏元素,但仍占用布局空间; -
opacity:0
将元素隐藏为“可见性:隐藏”,并且仍然占用布局中的空间; 唯一的区别是不透明度使得一个元素部分透明;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(); });
我会用CSS class .hide { display: none!important; }
.hide { display: none!important; }
。
对于隐藏/显示,我调用.addClass("hide")/.removeClass("hide")
。 为了检查可见性,我使用.hasClass("hide")
。
如果您不打算使用.toggle()
或.animate()
方法,那么这是一种简单明了的方法来检查/隐藏/显示元素。
你也可以用普通的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和内联样式
-
不需要框架
可以简单地使用hidden
或visible
属性,如:
$('element:hidden') $('element:visible')
或者你可以简化如下。
$(element).is(":visible")
你应该考虑的另一个答案是,如果你隐藏一个元素,你应该使用jQuery ,而不是实际隐藏它,你删除整个元素,但是你把它的HTML内容和标签本身复制到一个jQueryvariables,然后所有你需要做的就是testing屏幕上是否有这样的标签,使用正常的if (!$('#thetagname').length)
。
ebdiv
应该设置为style="display:none;"
。 这是显示和隐藏的作品:
$(document).ready(function(){ $("#eb").click(function(){ $("#ebdiv").toggle(); }); });
HTML
<div id="clickme"> Click here </div> <img id="book" src="http://www.chromefusion.com/wp-content/uploads/2012/06/chrome-logo.jpg" alt="" />
jQuery的
<script> $('#clickme').click(function() { $('#book').toggle('slow', function() { // Animation complete. alert( $('#book').is(":visible"));//<--- TRUE if Visible False if Hidden }); }); </script>
资源:
Blogger插件 – 玩jQuery的工具和小工具:如何查看元素隐藏或可见使用jQuery
的jsfiddle:
JSFiddle – ipsjolly – k4WWj
当在jQuery中testing一个元素时, :hidden
select器应该被认为是一个绝对定位的元素,虽然它们的子元素是可见的,但可以被认为是隐藏的 。
这看起来有点反直觉 – 尽pipe仔细看看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>
这可能工作:
expect($("#message_div").css("display")).toBe("none");
要检查它是否不可见我使用!
:
if ( !$('#book').is(':visible')) { alert('#book is not visible') }
或者以下也是山姆,保存在一个variables的jQueryselect器有更好的性能,当你需要它多次:
var $book = $('#book') if(!$book.is(':visible')) { alert('#book is not visible') }
使用类切换,而不是风格编辑。 。 。
使用指定用于“隐藏”元素的类很容易,也是最有效的方法之一。 使用“无” Display
样式来切换“隐藏”类将比直接编辑该样式更快。 我在堆栈溢出问题中解释了一些相当彻底的问题将两个元素可见/隐藏在同一个div中 。
JavaScript最佳实践和优化
Google前端工程师Nicholas Zakas在Google Tech Talk上展示了一个真正启发性的video:
- 加快您的Javascript (YouTube)
例:
$(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>
使用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>
毕竟,没有一个例子适合我,所以我写了自己的。
testing (不支持Internet Explorer filter:alpha
):
a)检查文件是否隐藏
b)检查一个元素是否具有零宽度/高度/不透明度或display:none
/ visibility:hidden
在内联样式中
c)检查元素的中心(也是因为它快于testing每个像素/angular)比其他元素(和所有祖先,例如: overflow:hidden
/ scroll / one元素over enother)或屏幕边缘
d)检查元素是否具有零宽度/高度/不透明度或display:none
/ visibility:隐藏在计算样式中(在所有祖先中)
testing
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
你需要检查两个显示以及可视性:
if ($(this).css("display") == "none" || $(this).css("visibility") == "hidden") { // The element is not visible } else { // The element is visible }
如果我们检查$(this).is(":visible")
,jQuery会自动检查这两个事物。
也许你可以做这样的事情
$(document).ready(function() { var visible = $('#tElement').is(':visible'); if(visible) { alert("visible"); // Code } else { alert("hidden"); } });
<script src="jquery-1.10.2.js"></script> <input type="text" id="tElement" style="display:block;">Firstname</input>
因为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; } });
但是如果元素的CSS如下所示呢?
.element{ position: absolute;left:-9999; }
所以这个堆栈溢出问题的答案如何检查一个元素是否在屏幕外也应该考虑。
if($('#postcode_div').is(':visible')) { if($('#postcode_text').val()=='') { $('#spanPost').text('\u00a0'); } else { $('#spanPost').text($('#postcode_text').val()); }
可以创build一个函数来检查可见性/显示属性,以便判断元素是否显示在UI中。
function checkUIElementVisible(element) { return ((element.css('display') !== 'none') && (element.css('visibility') !== 'hidden')); }
工作小提琴
通过检查一个布尔值来检查可见性,比如:
if (this.hidden === false) { // Your code }
我为每个函数使用了这个代码。 否则,您可以使用is(':visible')
来检查元素的可见性。
这里还有一个三元条件expression式来检查元素的状态,然后切换它:
$('someElement').on('click', function(){ $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); });