2013-07-17 14 views
5

jQuery :visible i :hidden selektory są nieco mylące, oni wybrać elementy, które zużywają miejsca w dokumencie, więc coś z visibility:hidden jest klasyfikowany jako :visible mimo to nie o_Oreallyvisible selektor

muszę być w stanie wybrać Jedyne elementy, które są :reallyvisible, że widzę oczami przykład nie opacity:0 lub visibility:hidden

Oczywiście za element będzie widoczny wizualnie wszystkich jego przodkowie muszą być również widoczne więc zakładam rekurencyjny patrzeć drzewo byłoby konieczne .

Czy to zbyt drogie? Czy ktoś może zaproponować niezawodny skuteczny sposób, aby to osiągnąć?

+0

mógłby pan produkować proste demo [JS Fiddle] (http://jsfiddle.net/) gdzie ': visible' kończy się niepowodzeniem (w ten sposób nie wszyscy musimy stworzyć naszą własną wersję, aby ci pomóc)? I czy musi to być selektor '' realvisible' lub czy metoda wtyczki będzie akceptowalna '.reallyvisible()'? –

+0

Czy dobrym testem dla ': realvisible' nie byłoby stworzenie childnode i sprawdzenie, czy jest on widoczny? – DevlshOne

+2

Istnieje kilka wpisów na blogu na ten temat, np .: http://darshanmarathe.blogspot.com.au/2012/03/is-really-visible-jquery-selector.html - prawdopodobnie można dostosować ten kod, aby zrobić dokładnie co chcesz. – nnnnnn

Odpowiedz

3

Jak o:

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

wygląda przyzwoicie, sprawdzając tylko niektóre przypadki krawędzi – Rob

+0

tylko poprawiono, aby sprawdzić właściwość wyświetlania, ale poza tym. Świetna robota dzięki! – Rob

1

Spróbuj kod:

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

Brakujące sprawdzanie i wyświetlanie przez rodziców: brak –

+1

I podejrzewają, że OP już wie, jak wykonać test taki jak ten, ale powiedział: "Oczywiście, aby element był widoczny wizualnie, wszyscy jego przodkowie muszą być widoczni, więc zakładam, że konieczne będzie rekurencyjne spojrzenie na drzewo". chcesz skomentować, jak można to zrobić wydajnie? – nnnnnn

+0

Nie widziałem tej linii. Przepraszam. Edytowałem swoją odpowiedź. –