O, bir elementin görünürlüğünü değiştirmek işlevlerini kullanarak mümkün mü .hide()
, .show()
yoksa .toggle()
?
Bir eleman olup olmadığını nasıl test olacağını visible
ya hidden
?
O, bir elementin görünürlüğünü değiştirmek işlevlerini kullanarak mümkün mü .hide()
, .show()
yoksa .toggle()
?
Bir eleman olup olmadığını nasıl test olacağını visible
ya hidden
?
Yanıtlar:
Soru tek bir öğeye atıfta bulunduğundan, bu kod daha uygun olabilir:
// Checks CSS content for display:[none|block], ignores visibility:[true|false]
$(element).is(":visible");
// The same works with hidden
$(element).is(":hidden");
Twistin önerisi ile aynıdır , ancak tek bir elemana uygulanır; ve jQuery SSS bölümünde önerilen algoritma ile eşleşir .
Seçilen öğeyi başka bir öğe, seçici veya herhangi bir jQuery nesnesiyle kontrol etmek için jQuery's (() öğesini kullanırız. Bu yöntem, iletilen parametreyi karşılayan bir eşleşme bulmak için DOM öğeleri boyunca dolaşır. Bir eşleşme varsa true, aksi halde false döndürür.
visible=false
ve display:none
; Mote'un çözümü kodlayıcıları kontrol etme niyetini açıkça ortaya koyarken display:none
; (saklamayın ve hangi kontrolün display:none
olmadığını gösterin visible=true
)
:visible
chiborg'un işaret ettiği gibi ana öğelerin görünür olup olmadığını da kontrol edecektir.
display
özelliği kontrol ettiğini açıkça belirtecağım . Orijinal soru için show()
ve hide()
ve onlar set için display
, benim cevap doğru. Bu arada IE7 ile çalışıyor, burada bir test snippet'i var - jsfiddle.net/MWZss ;
hidden
Seçiciyi kullanabilirsiniz :
// Matches all elements that are hidden
$('element:hidden')
Ve visible
seçici:
// Matches all elements that are visible
$('element:visible')
type="hidden"
, tetikleyebilen yalnızca bir durumdur: gizli. Yüksekliği ve genişliği olmayan elemanlar display: none
, ataları olan elemanlar ve gizli ataları olan elemanlar da şu şekilde nitelendirilir:
if ( $(element).css('display') == 'none' || $(element).css("visibility") == "hidden"){
// 'element' is hidden
}
Yukarıdaki yöntem, ebeveynin görünürlüğünü dikkate almaz. Ebeveyni de dikkate almak için .is(":hidden")
veya seçeneğini kullanmalısınız .is(":visible")
.
Örneğin,
<div id="div1" style="display:none">
<div id="div2" style="display:block">Div2</div>
</div>
Yukarıdaki yöntem
div2
görünür:visible
olmasa da görünür olarak değerlendirilecektir . Ancak, yukarıdaki gibi birçok durumda yararlı olabilir, özellikle gizli ebeveynte görünür herhangi bir hata div olup olmadığını bulmanız gerektiğinde, bu gibi durumlarda:visible
çalışmaz.
hide()
, show()
ve toggle()
işlevlerini kullanarak , ancak daha önce de belirtildiği gibi, :visible
ve :hidden
sözde sınıfları kullanmalıyız.
Bu cevapların hiçbiri, soru olarak anladığım şeyi, yani aradığım şey olan "Sahip olan öğeleri nasıl ele alırım visibility: hidden
?" . Her ikisi :visible
de :hidden
belgelere göre ekran aradığı için bunu da ele almayacaktır. Belirleyebildiğim kadarıyla, CSS görünürlüğünü idare edecek bir seçici yok. İşte nasıl çözdüm (standart jQuery seçiciler, daha yoğun bir sözdizimi olabilir):
$(".item").each(function() {
if ($(this).css("visibility") == "hidden") {
// handle non visible state
} else {
// handle visible state
}
});
visibility
tam anlamıyla ele almak iyi , ama soru buydu How you would test if an element has been hidden or shown using jQuery?
. JQuery kullanmak şu anlama gelir: display
özellik.
visibility: hidden
veya opacity: 0
tüketen öğeler olduğu kabul edilir, çünkü düzende yer kaplarlar. Bkz tarafından cevap Pedro Rainho ve jQuery belgelerine üzerinde :visible
selektör.
Gönderen nasıl toggled elemanın durumunu belirliyorsunuz?
:visible
Ve :hidden
seçicilerini kullanarak bir öğenin daraltılıp dağıtılmadığını belirleyebilirsiniz.
var isVisible = $('#myDiv').is(':visible');
var isHidden = $('#myDiv').is(':hidden');
Görünürlüğüne göre bir öğeye göre hareket ediyorsanız, yalnızca seçici ifadeye :visible
veya :hidden
seçici ifadesine dahil edebilirsiniz . Örneğin:
$('#myDiv:visible').animate({left: '+=200px'}, 'slow');
top:-1000px
sanırım ... Bu bir son durum
Genellikle bir şeyin görünür olup olmadığını kontrol ederken, hemen ileri gidecek ve onunla başka bir şey yapacaksınız. jQuery zincirleme bunu kolaylaştırır.
Dolayısıyla, bir seçiciniz varsa ve üzerinde yalnızca görünür veya gizli olduğunda bir işlem yapmak istiyorsanız, bunu yapmak istediğiniz eylemle zincirleyerek kullanabilir filter(":visible")
veya filter(":hidden")
takip edebilirsiniz .
Yani bir if
ifade yerine, şöyle:
if ($('#btnUpdate').is(":visible"))
{
$('#btnUpdate').animate({ width: "toggle" }); // Hide button
}
Veya daha verimli, ancak daha çirkin:
var button = $('#btnUpdate');
if (button.is(":visible"))
{
button.animate({ width: "toggle" }); // Hide button
}
Hepsini tek bir satırda yapabilirsiniz:
$('#btnUpdate').filter(":visible").animate({ width: "toggle" });
:visible
Uygun seçici jQuery belgeler :
- CSS
display
değeri vardırnone
.- Bunlar form elementleridir
type="hidden"
.- Genişlikleri ve yükseklikleri açıkça 0'a ayarlanmıştır.
- Bir üst öğe gizlendiğinden öğe sayfada gösterilmiyor.
Düzeni olan
visibility: hidden
veyaopacity: 0
tüketen öğeler olduğu kabul edilir, çünkü düzende yer kaplarlar.
Bu, bazı durumlarda yararlı ve diğerlerinde işe yaramaz, çünkü öğenin görünür olup olmadığını kontrol etmek istiyorsanız ( display != none
), ebeveynlerin görünürlüğünü göz ardı ederek, yapmanın .css("display") == 'none'
sadece daha hızlı olmadığını, aynı zamanda görünürlük kontrolünü doğru bir şekilde döndüreceğini göreceksiniz.
Yerine ekranın görünürlüğünü kontrol etmek isterseniz, kullanmak gerekir: .css("visibility") == "hidden"
.
Ek jQuery notlarını da dikkate alın :
Çünkü
:visible
bir jQuery eklentisi olup CSS şartname parçasıdır kullanarak sorguları:visible
yerli DOM tarafından sağlanan performans artışı yararlanmak edemezquerySelectorAll()
yöntemle.:visible
Eleman seçerken kullanırken en iyi performansı elde etmek için , önce saf CSS seçiciyi kullanarak elemanları seçin, ardından kullanın.filter(":visible")
.
Ayrıca, performans konusunda endişeleriniz varsa, Şimdi beni görüyorsunuz… performansı göster / gizle (2010-05-04) seçeneğini işaretlemelisiniz. Ve öğeleri göstermek ve gizlemek için diğer yöntemleri kullanın.
Eleman görünürlüğü ve jQuery nasıl çalışır ;
Bir element ile gizlenmiş olabilir display:none
, visibility:hidden
ya da opacity:0
. Bu yöntemler arasındaki fark:
display:none
öğeyi gizler ve yer kaplamaz;visibility:hidden
öğeyi gizler, ancak düzende hala yer kaplar;opacity:0
öğeyi "görünürlük: gizli" olarak gizler ve düzende hala yer kaplar; tek fark, opaklığın kişinin bir elemanı kısmen saydam yapmasına izin vermesidir;
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: ""
});
}
Yararlı jQuery geçiş yöntemleri:
$('.click').click(function() {
$('.target').toggle();
});
$('.click').click(function() {
$('.target').slideToggle();
});
$('.click').click(function() {
$('.target').fadeToggle();
});
visibility:hidden
ve opacity:0
eleman hala ile (tıklamalar gibi) olaylara yanıt olacaktır opacity:0
. Dosya yüklemeleri için özel bir düğme oluşturmanın bu numarayı öğrendim.
Bunu düz JavaScript kullanarak da yapabilirsiniz:
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;
}
Notlar:
Her yerde çalışır
İç içe elemanlar için çalışır
CSS ve satır içi stiller için çalışır
Çerçeve gerektirmez
visibility: hidden
olduğu görülebilir .
CSS sınıfını kullanırdım .hide { display: none!important; }
.
Saklanmak / göstermek için ararım .addClass("hide")/.removeClass("hide")
. Görünürlüğü kontrol etmek için kullanıyorum .hasClass("hide")
.
Kullanmayı .toggle()
veya .animate()
yöntemi kullanmayı planlamıyorsanız, öğeleri kontrol etmenin / gizlemenin / göstermenin basit ve açık bir yoludur .
.hasClass('hide')
ebeveynin bir atasının gizli olup olmadığını kontrol etmez (bu da onu gizler). Muhtemelen bunu kontrol ederek doğru çalışmasını sağlayabilirsiniz .closest('.hide').length > 0
, ama neden tekerleği yeniden icat ettiniz ?
$('#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" alt="" width="300"/>
Kaynak:
Dikkate almanız gereken başka bir yanıt, bir öğeyi gizliyorsanız, jQuery kullanmanız gerekir , ancak aslında gizlemek yerine, tüm öğeyi kaldırırsınız, ancak HTML içeriğini ve etiketinin kendisini bir jQuery değişkenine kopyalarsınız ve sonra Yapmanız gereken tek şey normal olanı kullanarak ekranda böyle bir etiket olup olmadığını test etmektir if (!$('#thetagname').length)
.
Bir öğeyi jQuery'de :hidden
seçiciye karşı test ederken , mutlak konumlandırılmış bir öğenin alt öğeleri görünür olmasına rağmen gizli olarak tanınabileceği düşünülmelidir .
Bu, ilk etapta biraz sezgisel görünüyor - jQuery belgelerine daha yakından bakmak, ilgili bilgileri veriyor:
Öğeler çeşitli nedenlerle gizli olarak kabul edilebilir: [...] Genişlikleri ve yükseklikleri açıkça 0 olarak ayarlanmıştır. [...]
Bu aslında kutu modeli ve elemanın hesaplanan stili açısından anlamlıdır. Genişlik ve yükseklik açıkça 0 olarak ayarlanmamış olsa bile, örtük olarak ayarlanabilir .
Aşağıdaki örneğe bir göz atın:
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 için güncelleme:
JQuery 3 ile açıklanan davranış değişecektir! Öğelerin, sıfır genişlik ve / veya yükseklik dahil olmak üzere herhangi bir düzen kutusu varsa görünür olduğu kabul edilecektir.
JQuery 3.0.0-alpha1 ile JSFiddle:
Aynı JavaScript kodunun çıktısı şu olur:
console.log($('.foo').is(':hidden')); // false
console.log($('.bar').is(':hidden')); // false
Bu işe yarayabilir:
expect($("#message_div").css("display")).toBe("none");
Misal:
$(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>
Görünür olup olmadığını kontrol etmek için şunu kullanıyorum !
:
if ( !$('#book').is(':visible')) {
alert('#book is not visible')
}
Veya aşağıdakiler de sam'dir, jQuery seçiciyi birden çok kez ihtiyacınız olduğunda daha iyi performans elde etmek için bir değişkene kaydeder:
var $book = $('#book')
if(!$book.is(':visible')) {
alert('#book is not visible')
}
Elemanları "gizlemek" için belirlenmiş sınıfları kullanmak kolaydır ve aynı zamanda en verimli yöntemlerden biridir. 'Gizli' sınıfı ' Display
hiçbiri' stiliyle değiştirmek, o stili doğrudan düzenlemekten daha hızlı gerçekleşir. Yığın Taşması sorusundaki bu konuların bazılarını aynı div'da görünür / gizli iki öğeyi döndürerek açıkladım .
İşte Google ön uç mühendisi Nicholas Zakas'ın bir Google Tech Talk'un gerçekten aydınlatıcı bir videosu:
Reklam engelleyici için görünür denetimin kullanılmasına örnek :
$(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", reklam engelleyiciyi engelleyen bir kimliktir. Dolayısıyla, görünür olup olmadığını kontrol ederek reklam engelleyicinin Açık olup olmadığını tespit edebilirsiniz.
Sonuçta, hiçbir örnek bana uygun değil, bu yüzden kendim yazdım.
Testler (Internet Explorer desteği yok filter:alpha
):
a) Belgenin gizli olup olmadığını kontrol edin
b) Bir elemanın sıfır genişlik / yükseklik / opaklık veya display:none
/ visibility:hidden
satır içi stilleri olup olmadığını kontrol edin
c) Öğenin merkezinin (her piksel / köşeyi test etmekten daha hızlı olduğu için) başka bir öğe (ve tüm atalar, örneğin: overflow:hidden
/ scroll / bir öğeyi diğerinin üzerinde) tarafından gizlenip gizlenmediğini kontrol edin
d) Bir elemanın sıfır genişlik / yükseklik / opaklık veya display:none
görünürlük olup olmadığını kontrol edin : hesaplanan stillere gizlenmiş (tüm atalar arasında)
Üzerinde test edildi
Android 4.4 (Yerel tarayıcı / Chrome / Firefox), Firefox (Windows / Mac), Chrome (Windows / Mac), Opera (Windows Presto / Mac WebKit), Internet Explorer (Internet Explorer 5-11 belge modları + Internet Explorer 8 sanal makine) ve 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;
}
})();
Nasıl kullanılır:
is_visible(elem) // boolean
Her ikisini de kontrol etmeniz gerekir ... Görünürlüğün yanı sıra ekran:
if ($(this).css("display") == "none" || $(this).css("visibility") == "hidden") {
// The element is not visible
} else {
// The element is visible
}
Kontrol edersek $(this).is(":visible")
, jQuery her iki şeyi de otomatik olarak kontrol eder.
Belki böyle bir şey yapabilirsiniz
$(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>
Yalnızca aşağıdaki gibi bir boole değeri kontrol ederek görünürlüğü kontrol edin:
if (this.hidden === false) {
// Your code
}
Bu kodu her işlev için kullandım. Aksi takdirde is(':visible')
, bir öğenin görünürlüğünü kontrol etmek için kullanabilirsiniz .
Çünkü Elements with visibility: hidden or opacity: 0 are considered visible, since they still consume space in the layout
( jQuery: visible Selector için açıklandığı gibi ) - öğenin gerçekten bu şekilde görünür olup olmadığını kontrol edebiliriz :
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;
}
});
Ancak, öğenin CSS'si aşağıdaki gibi olursa ne olur?
.element{
position: absolute;left:-9999;
}
Bu nedenle Yığın Taşması sorusuna verilen cevap Bir öğenin ekran dışında olup olmadığı nasıl kontrol edilir.
Öğenin kullanıcı arayüzünde gösterilip gösterilmediğini ölçmek için görünürlük / görüntüleme niteliklerini kontrol etmek amacıyla bir işlev oluşturulabilir.
function checkUIElementVisible(element) {
return ((element.css('display') !== 'none') && (element.css('visibility') !== 'hidden'));
}
Ayrıca, öğenin durumunu kontrol etmek ve daha sonra değiştirmek için üçlü bir koşullu ifade:
$('someElement').on('click', function(){ $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); });
$('elementToToggle').toggle('slow');
...:)
$(element).is(":visible")
altında jQuery 1.4.4 için çalışan, ancak jQuery 1.3.2 için çalışmayan (bunca zamandan sonra bile) bahsetmeye değer . Bu, Tsvetomir Tsonev'in yararlı test snippet'i kullanılarak test edilebilir . Her birinin altında test etmek için jQuery sürümünü değiştirmeyi unutmayın.