2013-07-17 21 views
5

jquery :visible ve :hidden seçicileri dolayısıyla visibility:hidden ile bir şey oreallyvisible seçici

Ben seçebilmek için gereken o_O olmadığı halde :visible olarak kabul edilir, belgede yer tüketir öğeleri seçin, biraz yanıltıcı gözlerimle görebilirsiniz :reallyvisible sadece elementler, örneğin değil opacity:0 veya bir eleman tüm o ataları da bir özyinelemeli bakmak ağaç gerekli olacağını varsayıyorum böylece görünür olmalıdır görsel görünebilmesi için Açıkçası

visibility:hidden .

Bu çok mu pahalı? Bunu başarabilmek için güvenilir ve etkili bir yöntem önerilebilir mi?

function isVisible(el){ 
    if (el.css('opacity') != '0' && el.css('visibility') != 'hidden') { 
     return true 
    } 
    return false 
} 

$('myelement').filter(function() { 
    visible = true 

    if (isVisible($(this)) == false) 
     visible = false 

    $(this).parents().each(function(){ 
     if (isVisible($(this)) == false) 
      visible = false 
    }) 

    return visible == true 
}).html("I'm really visible !") 
+0

basit [JS Fiddle demo] üretmek Could (http://jsfiddle.net/) nerede ': 'görünür' başarısız (bu şekilde size yardımcı olmak için hepimizin kendi versiyonumuzu yaratmamız gerekmez)? Ve bir seçici olmak zorunda: '' gerçekten görünebilir 'ya da bir eklenti yöntemi kabul edilebilir' .reallyvisible() '? –

+0

: "Gerçektendeğer" için iyi bir test yapılmaz, bir childnode oluşturabilir ve görünüp görünmediğine bakılabilir mi? – DevlshOne

+2

Bu konuyla ilgili birkaç blog yayını var, örneğin: http://darshanmarathe.blogspot.com.au/2012/03/is-really-visible-jquery-selector.html - muhtemelen bu kodu tam olarak ne istiyorsan onu. – nnnnnn

cevap

3

ne dersiniz:

+0

iyi görünüyor, sadece bazı kenar durumlarda – Rob

+0

kontrol sadece ekran özelliğini kontrol etmek için değiştirildi, ancak başka türlü. harika iş teşekkürler! – Rob

1

bu kodu deneyin

$.expr[':'].reallyVisible = function(node, idx){ 

    while(true){ 

     // should be faster than $(node).css() 
     var css = document.defaultView.getComputedStyle(node, null); 

     if(css.opacity == 0 || css.visibility == 'hidden') 
     return false; 

    node = node.parentNode; 

    if(!node || node === document) 
     break; 
    }   

    return true; 
} 

http://jsfiddle.net/jxEFk/

+0

için aradığım makale bu gibi görünüyor Ebeveyn kontrolü eksik ve görüntülenemiyor: none –

+1

I OP'nin zaten böyle bir testin nasıl yapılacağını bildiğinden şüpheliyse de, "Görünüşe göre bir öğenin görsel olarak görünür olması için tüm atalarının da görünür olması gerekir. Bu nedenle, ağacın tekrarlanması gereken bir bakışın gerekli olacağını düşünüyorum." _ Belki de Bunun nasıl verimli bir şekilde yapılabileceği hakkında yorum yapmak ister misiniz? – nnnnnn

+0

Bu hattı görmedim. Afedersiniz. Cevabımı düzenledim. –