Prüfen, ob das Element im DOM sichtbar ist

Gibt es eine Möglichkeit, dass ich überprüfen kann, ob ein Element in reinem JS (keine jQuery) sichtbar ist?

Also, zum Beispiel, auf dieser Seite: Performance Bikes, wenn Sie mit dem Mauszeiger über Deals (im oberen Menü) fahren, erscheint ein Fenster mit Angeboten, aber am Anfang wurde es nicht angezeigt. Es ist im HTML-Code enthalten, aber nicht sichtbar.

Wie kann ich also bei einem DOM-Element prüfen, ob es sichtbar ist oder nicht? Ich habe es versucht:

window.getComputedStyle(my_element)['display']);

aber es scheint nicht zu funktionieren. Ich frage mich, welche Attribute ich überprüfen sollte. Es fällt mir ein:

display !== 'none'
visibility !== 'hidden'

Gibt es noch andere, die ich vielleicht übersehe?

Lösung

Laut dieser MDN-Dokumentation gibt die Eigenschaft offsetParent eines Elements null zurück, wenn das Element oder eines seiner Elternteile über die Eigenschaft display style ausgeblendet wird. Stellen Sie einfach sicher, dass das Element nicht fixiert ist. Ein Skript, um dies zu überprüfen, wenn Sie keine "Position: fixed"-Elemente auf Ihrer Seite haben, könnte wie folgt aussehen:

// Where el is the DOM element you'd like to test for visibility
function isHidden(el) {
    return (el.offsetParent === null)
}

Wenn Sie jedoch noch positionsfixierte Elemente haben, die bei dieser Suche erwischt werden könnten, müssen Sie leider (und langsam) window.getComputedStyle() verwenden. Die Funktion könnte in diesem Fall lauten:

// Where el is the DOM element you'd like to test for visibility
function isHidden(el) {
    var style = window.getComputedStyle(el);
    return (style.display === 'none')
}

Option #2 ist wahrscheinlich etwas einfacher, da sie mehr Randfälle berücksichtigt, aber ich wette, sie ist auch um einiges langsamer, wenn Sie also diesen Vorgang viele Male wiederholen müssen, sollten Sie sie wahrscheinlich vermeiden.

Kommentare (19)

Dies kann helfen : Blenden Sie das Element aus, indem Sie es ganz links positionieren und dann die Eigenschaft offsetLeft überprüfen. Wenn Sie jQuery verwenden möchten, können Sie einfach den :visible Selektor überprüfen und den Sichtbarkeitsstatus des Elements erhalten.

HTML :

<div id="myDiv">Hello</div>

CSS :


#myDiv{
   position:absolute;
   left : -2000px;
}


#myDiv{
    visibility:hidden;
}

javaScript :

var myStyle = document.getElementById("myDiv").offsetLeft;

if(myStyle < 0){
     alert("Div is hidden!!");
}

jQuery :

if(  $("#MyElement").is(":visible") == true )
{  
     alert("Div is hidden!!");        
}

jsFiddle

Kommentare (7)

Wenn wir nur die grundlegenden Möglichkeiten zur Feststellung der Sichtbarkeit sammeln, darf ich nicht vergessen:

opacity > 0.01; // probably more like .1 to actually be visible, but YMMV

Und wie man Attribute erhält:

element.getAttribute(attributename);

Also, in deinem Beispiel:

document.getElementById('snDealsPanel').getAttribute('visibility');

Aber was? Das funktioniert hier nicht. Schauen Sie genauer hin und Sie werden feststellen, dass die Sichtbarkeit nicht als Attribut des Elements aktualisiert wird, sondern über die Eigenschaft "style". Das ist eines von vielen Problemen bei dem Versuch, das zu tun, was Sie tun. Unter anderem können Sie nicht garantieren, dass es in einem Element tatsächlich etwas zu sehen gibt, nur weil seine Sichtbarkeit, Anzeige und Deckkraft die richtigen Werte haben. Es könnte immer noch keinen Inhalt haben, oder es könnte keine Höhe und Breite haben. Ein anderes Objekt könnte es verdecken. Eine schnelle Google-Suche ergibt dies und enthält sogar eine Bibliothek, mit der das Problem gelöst werden kann. (YMMV)

Schauen Sie sich die folgenden Seiten an, die möglicherweise Duplikate dieser Frage sind, mit ausgezeichneten Antworten, einschließlich einiger Einsichten von dem mächtigen John Resig. Ihr spezieller Anwendungsfall unterscheidet sich jedoch geringfügig von der Standardfrage, daher verzichte ich auf eine Kennzeichnung:

(EDIT: OP SAGT ER'S SCRAPING SEITEN, NICHT ERSTELLEN SIE, SO UNTEN ISN'T ANWENDBAR) Eine bessere Option? Binden Sie die Sichtbarkeit von Elementen an Modelleigenschaften und machen Sie die Sichtbarkeit immer von diesem Modell abhängig, so wie es Angular mit ng-show macht. Sie können das mit jedem beliebigen Tool machen: Angular, einfaches JS, was auch immer. Besser noch, Sie können die DOM-Implementierung im Laufe der Zeit ändern, aber Sie werden immer in der Lage sein, den Zustand aus dem Modell zu lesen, anstatt aus dem DOM. Ihre Wahrheit aus dem DOM zu lesen ist schlecht. Und langsam. Viel besser ist es, das Modell zu überprüfen und auf Ihre Implementierung zu vertrauen, um sicherzustellen, dass der DOM-Zustand das Modell widerspiegelt. (Und verwenden Sie automatisierte Tests, um diese Annahme zu bestätigen.)

Kommentare (1)