javascript js判断元素是否可见 - 如何检查jQuery中是否隐藏了一个元素?




js判断元素是否显示 js判断元素是否在可视区域 (25)

$('#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="" />

资源:

Blogger Plug n Play - jQuery工具和小部件:如何使用jQuery查看元素是隐藏还是可见

的jsfiddle:

JSFiddle - ipsjolly - k4WWj

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

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


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


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

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

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


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

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

例:

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


您可以使用hidden选择器:

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

visible选择器:

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

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

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

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

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

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

还要考虑额外的jQuery注释

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

另外,如果你担心表现,你应该检查现在你看到我...显示/隐藏表现 (2010-05-04)。 并使用其他方法来显示和隐藏元素。


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

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

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

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

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

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

工作小提琴


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


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

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

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


if($('#postcode_div').is(':visible')) {
    if($('#postcode_text').val()=='') {
        $('#spanPost').text('\u00a0');
    } else {
        $('#spanPost').text($('#postcode_text').val());
}

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

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

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

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

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

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


如何确定切换元素的状态?

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

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

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

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

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

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

a)检查文档是否未隐藏

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

c)检查元素的中心(也因为它比测试每个像素/角更快)是否被其他元素(和所有祖先,例如: overflow:hidden / scroll / one element over theother)或屏幕边缘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)虚拟机),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

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

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

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

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

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

可以使用display:none隐藏元素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();
    });
    

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

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

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

var $book = $('#book')

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

这可能有效:

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

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


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


收听播客JavaScript Jabber:第32集,其中包括AngularJS的原始创作者:Misko Hevery和Igor Minar。他们谈论了从其他JavaScript背景到AngularJS的内容,特别是jQuery。

在播客中提出的观点之一让我对你的问题有所了解:

MISKO:[...]我们在Angular中很少考虑的事情之一是,我们如何提供大量的逃生舱,这样你就可以走出去,基本上找到一条出路。所以对我们来说,答案就是这个叫做“指令”的东西。使用指令,你基本上成为一个常规的小jQuery JavaScript,你可以做任何你想做的事情。

IGOR:所以将指令视为编译器的指令,告诉它每当你遇到模板中的这个特定元素或这个CSS时,你就会保留这种代码,并且代码负责元素和元素下面的所有内容在DOM树中。

整个剧集的成绩单可在上面提供的链接中找到。

所以,直接回答你的问题:AngularJS是非常自以为是的,是一个真正的MV *框架。但是,你仍然可以在指令中使用jQuery来完成你所熟悉和喜爱的所有非常酷的东西。这不是“我如何做我在jQuery中常用的东西?”的问题。就像“我如何用jQuery中的所有东西来补充AngularJS一样”这个问题一样多。“

这真的是两种截然不同的心态。





javascript jquery dom visibility