javascript js顯示隱藏 如何檢查jQuery中是否隱藏了一個元素?




js顯示隱藏 (24)

您可以使用hidden選擇器:

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

visible選擇器:

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

可以使用函數.show() .toggle() .show().toggle()來切換元素的可見性。

如何測試元素是可見還是隱藏?


可以簡單地使用hiddenvisible屬性,例如:

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

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

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

使用類切換,而不是樣式編輯。 。 。

使用指定用於“隱藏”元素的類很容易,也是最有效的方法之一。 將Display樣式為“無”的“隱藏”類切換比直接編輯該樣式的速度更快。 我在問題中詳細解釋了其中的一些問題。在同一個div中轉換兩個元素可見/隱藏

JavaScript最佳實踐和優化

以下是Google前端工程師Nicholas Zakas撰寫的Google Tech Talk的真實啟發視頻:


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


例:

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


這可能有效:

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

這適用於我,我使用show()hide()使我的div隱藏/可見:

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

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

: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)。 並使用其他方法來顯示和隱藏元素。


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



要檢查它是否不可見我使用!

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

或者以下也是sam,將jQuery選擇器保存在變量中,以便在需要多次時獲得更好的性能:

var $book = $('#book')

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

畢竟,沒有一個例子適合我,所以我寫了自己的。

測試 (不支持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

可以創建函數以檢查可見性/顯示屬性,以便衡量元素是否在UI中顯示。

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

工作小提琴


你需要檢查兩個......顯示和可見性:

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

由於問題涉及單個元素,因此該代碼可能更合適:

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

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

twernt的建議相同,但適用於單個元素; 它與jQuery FAQ中推薦的算法相匹配


我會使用CSS類.hide { display: none!important; } .hide { display: none!important; }

對於隱藏/顯示,我調用.addClass("hide")/.removeClass("hide") 。 為了檢查可見性,我使用.hasClass("hide")

如果您不打算使用.toggle().animate()方法,那麼檢查/隱藏/顯示元素是一種簡單明了的方法。


只需通過檢查布爾值來檢查可見性,例如:

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

我為每個函數使用了這個代碼。 否則,您可以使用is(':visible')來檢查元素的可見性。


ebdiv應設置為style="display:none;" 。 它適用於show和hide:

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

元素可見性和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();
    });
    

這些答案都沒有解決我理解的問題,這就是我正在尋找的問題, “我如何處理具有visibility: hidden項目visibility: hidden ?” 。 既不是:visible也不是:hidden會處理這個,因為他們都在尋找文檔顯示。 據我所知,沒有選擇器來處理CSS可見性。 以下是我如何解決它(標準的jQuery選擇器,可能有更簡潔的語法):

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

如何確定切換元素的狀態?

您可以使用:visible:hidden選擇器確定元素是否已折疊。

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

如果您只是根據其可見性對元素進行操作,則可以在選擇器表達式中包含:visible:hidden 。 例如:

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






visibility