2015-02-03 16 views
5

Hintergrund: Ich arbeite derzeit an einem Projekt, in dem meine JS-App in mehrere andere (übergeordnete) JS-Anwendungen eingebettet ist. Einige Eltern-Apps können meine App anzeigen/verbergen, indem sie display: block/none auf ein Element setzen, das meine App enthält. Andere übergeordnete Apps entfernen vorübergehend meine App aus dem DOM und verbinden sie später wieder. Wenige Eltern-Apps verwenden Shadow-DOM, daher habe ich keinen Zugriff auf die Elemente in der Eltern-App.getBoundingClientRect zum Erkennen der Sichtbarkeit

Ich brauche eine Möglichkeit, um zu überprüfen, ob meine App sichtbar ist (innerhalb DOM und angezeigt; nicht Sichtbarkeit: versteckt und muss nicht im Ansichtsfenster sein), ohne die Eltern-Apps zu ändern, also schaute ich in getBoundingClientRect.

Frage: Zumindest auf Chrom, getBoundingClientRect Returns (w: 0, h: 0, l: 0, t: 0), wenn ein Element oder dessen Vorfahre hat Anzeige: keine oder wenn es entfernt wird, von DOM. Ich konnte keine Dokumentation über die Garantie dieses Verhaltens finden, und ich frage mich, ob es sicher ist (in dem Sinne, dass sich diese Logik nicht ändert), getBoundingClientRect zu verwenden, um nach der Sichtbarkeit eines Elements zu suchen.

Auch ich muss wissen, ob dieses Verhalten in allen gängigen Browsern, einschließlich FF, IE8 + und Safari, konsistent ist. Ist das irgendwo dokumentiert?

Schließlich, warum (0,0,0,0)? Ich fühle mich wie getBoundingClientRect sollte Null in solchen Fällen wie (0,0,0,0) eigentlich etwas anderes bedeutet. Gibt es einen guten Grund dafür?


Edited/zusätzliche Frage: Dank ISTOS für den Hinweis auf, dass null Rückkehr einige ahnungslosen Code brechen kann, wie zum Beispiel:

console.log(clientRectObject.height); 
// TypeError: Cannot read property 'height' of null 

nicht über das aktuelle Verhalten zu beschweren, sondern als Designfrage: Anstelle von null kann die Rückgabe einiger ungültiger Rect-Werte (z. B. negative Breite und Höhe) eine sinnvollere Alternative sein?

Antwort

3

Zuerst würde ich untersuchen, wie beliebte Bibliotheken wie jQuery ein ähnliches Problem lösen. Hier sind einige Links zu jQuery Quelle:

Des weiteren würde ich online nach Hinweisen einschließlich MDN suchen:

Leider ist der beste Weg, um zu überprüfen, ob das Verhalten von getBoundingClientRect das gleiche in den meisten Browsern ist tatsächlich innerhalb dieses Browser zu testen. Wenn Sie dies tun, gehen Sie bitte zurück zu MDN und fügen Sie Ihre Ergebnisse hinzu.


mich wie getBoundingClientRect fühlen sollte in solchen Fällen

null zurück Obwohl null Rückkehr würde in solchen Fällen logisch erscheint, ist es nicht wirklich ideal, denn normalerweise gibt es ein ClientRect Objekt mit den Eigenschaften oben, rechts, unten, links, Breite und Höhe, und Code wie dieser würde brechen:

console.log(clientRectObject.height); 
// TypeError: Cannot read property 'height' of null 

Mit anderen Worten, die API wäre auf diese Weise nicht konsistent.

+1

Vielen Dank für die Links und zusätzliche Erklärungen! – haejeong87

+1

In Bezug auf IE8 - _ "Breite und Höhe fehlen in IE8, also berechnen Sie sie manuell" _: https://github.com/twbs/bootstrap/commit/eaf21ec21d260ff7ed1e5b54e5185de235ff7034 – istos

Verwandte Themen