2013-07-17 9 views
5

Die jquery :visible und :hidden Selektoren sind ein wenig irreführend, sie Elemente auswählen, die den Raum in dem Dokument konsumiert, also etwas mit visibility:hidden ist eingestuft als :visible obwohl es nicht o_O istreallyvisible Selektor

Ich muß in der Lage sein, zu wählen nur Elemente, die :reallyvisible sind, dass ich mit meinen Augen sehen kann zB nicht opacity:0 oder visibility:hidden

Offensichtlich für ein Element visuell sichtbar alle sichtbaren es Vorfahren sein auch sein muss, so gehe ich davon eine rekursive der Baum aussehen würde notwendig sein, .

Ist das einfach zu teuer? Kann jemand einen zuverlässigen effizienten Weg vorschlagen, dies zu erreichen?

+0

Könnten Sie eine einfache [JS Fiddle Demo] erzeugen (http://jsfiddle.net/), in dem ': visible' scheitert (so müssen wir nicht alle unsere eigene Version erstellen, um Ihnen zu helfen)? Und muss es ein Selektor ': reallyvisible' sein oder wäre eine Plugin-Methode akzeptabel' .reallyvisible() '? –

+0

Wäre nicht ein guter Test für ': reallyvisible', einen Childnode zu erstellen und zu sehen, ob er sichtbar ist? – DevlshOne

+2

Es gibt ein paar Blog-Posts zu diesem Thema, zB: http://darshanmarathe.blogspot.com.au/2012/03/is-really-visible-jquery-selector.html - Sie können diesen Code wahrscheinlich genau anpassen was du willst. – nnnnnn

Antwort

3

Wie sei:

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

sieht anständig aus, nur einige Randfälle überprüfend – Rob

+0

gerade geändert, um die Anzeigeeigenschaft auch zu überprüfen, aber andernfalls. Tolle Arbeit, danke! – Rob

1

Versuchen Sie diesen Code:

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

Dies ist fehlende Eltern zu überprüfen und anzuzeigen: keine –

+1

I vermute, das OP weiß bereits, wie man einen Test wie diesen macht, aber er sagte: "Natürlich müssen alle Vorfahren sichtbar sein, damit ein Element sichtbar ist, also nehme ich an, dass ein rekursiver Blick auf den Baum notwendig ist." Sie möchten kommentieren, wie dies effizient durchgeführt werden könnte? – nnnnnn

+0

Ich habe diese Zeile nicht gesehen. Es tut uns leid. Ich habe meine Antwort bearbeitet. –