[javascript] 我如何檢查一個元素是否隱藏在jQuery中?



Answers

您可以使用hidden選擇器:

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

visible選擇器:

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

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

你會如何測試一個元素是否可見或隱藏?




可以創建一個函數來檢查可見性/顯示屬性,以便判斷元素是否顯示在UI中。

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

工作小提琴




也許你可以做這樣的事情

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




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

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



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

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

JavaScript最佳實踐和優化

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




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

測試 (不支持Internet Explorer filter:alpha ):

a)檢查文件是否隱藏

b)檢查元素是否具有零寬度/高度/不透明度或display:none / visibility:hidden在內聯樣式中

c)檢查元素的中心(也因為它比測試每個像素/角落更快)未被其他元素(和所有祖先overflow:hidden ,例如: overflow:hidden / scroll / one元素over enother)或屏幕邊緣

d)檢查元素是否具有零寬度/高度/不透明度或display:none / visibility:隱藏在計算樣式中(在所有祖先中)

經過測試

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鏈接使得這很簡單。

因此,如果你有一個選擇器,並且只有在可見或隱藏的情況下才想對其執行某些操作,則可以使用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;" 。 它是展示和隱藏的作品:

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



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



這裡還有一個三元條件表達式來檢查元素的狀態,然後切換它:

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



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

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

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




當針對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/

相同的JS將會有這樣的輸出:

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



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

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



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

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

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

var $book = $('#book')

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





Related