getBoundingClientRect () gibt in XUL null zurück

8

Ich habe ein Problem mit meiner Firefox-Erweiterung

Ich habe ein XUL-Popup-Panel mit einer hbox für die Tag-Cloud und einen JS-Code, um divs zu dieser hbox hinzuzufügen:

%Vor%

JS:

%Vor%

Ich muss die Dimensionen jedes hinzugefügten div bekommen, aber getBoundingClientRect weigert sich einfach zu arbeiten. Wenn ich Warnungen lösche, ist es immer Null. Mit Warnungen ist die Geschichte anders: Wenn die Warnung das erste Mal aufgerufen wird, gibt sie null zurück, obwohl das Div auf dem Bildschirm angezeigt wird. Alle nachfolgenden Warnungen geben die richtigen Koordinaten zurück.

Wenn ich in Chromebug einen Haltepunkt festlege, wird alles korrekt gemeldet. Wenn ich die Ausführung in keiner Weise unterbrechen und eine Schleife ausführen, werden nur Nullen zurückgegeben.

Das hat mich ziemlich verwirrt. Der Aufruf von "boxObject" führt zu denselben Ergebnissen, während "getClientRects [0]" beim ersten Aufruf nicht definiert ist.

Irgendwelche Hinweise darauf, was das verursachen könnte, werden sehr geschätzt.

    
Andrei Sch. 01.01.2011, 23:28
quelle

3 Antworten

1

Obwohl ich keine Dokumentation zu diesem scheinbar grundlegenden Problem finden kann, ist das Problem, das Sie bemerkt haben, höchstwahrscheinlich darauf zurückzuführen, dass der Layout-Prozess ("Reflow") noch nicht ausgeführt wurde für die Koordinaten.

Der Layout / Reflow-Prozess nimmt das DOM der Seite mit allen Stilen der Seite und bestimmt die Positionen und Dimensionen der Elemente und anderer Teile der Seite (Sie könnten versuchen, Hinweis auf HTML-Reflow , obwohl es nicht für Webentwickler gedacht ist und wahrscheinlich etwas veraltet ist.

Dieser Reflow-Prozess wird nicht synchron nach einer Änderung des DOM ausgeführt, sonst wie

%Vor%

würde das Layout zweimal aktualisieren, was ineffizient ist.

Auf der anderen Seite soll die Frage nach Elementen Position / Dimension (zumindest via .offsetTop ) das Layout zwingen, die korrekte Information zurückzugeben. Dies passiert in Ihrem Fall aus irgendeinem Grund nicht und ich bin mir nicht sicher warum.

Bitte erstellen Sie einen einfachen Testfall, der das Problem demonstriert und einen Bug in bugzilla.mozilla.org (CC me - [email protected]) eingibt.

Ich vermute, dass dies mit dem XUL-Layout zusammenhängt, das weniger robust ist als HTML; Sie könnten versuchen, die Cloud in einem HTML-Dokument in einem iframe oder zumindest in einer & lt; description & gt; Verwenden Sie createElementNS, um echte HTML-Elemente anstelle von xul: div zu erstellen, die Sie mit Ihrem aktuellen Code erstellen.

    
Nickolay 03.01.2011, 20:46
quelle
16

Hinweis: Vorsicht, wenn Sie getBoundingClientRect mit einem Element verwenden, das display: none hat, gibt es 0 an einer beliebigen Stelle in dom zurück.

    
Mwea 17.01.2013 17:00
quelle
0

Stellen Sie sicher, dass das DOM bereit ist. In meinem Fall sogar, wenn Sie die Funktion getBoundingClientRect für Klickereignisse verwenden. Die Bindung der Ereignisse, die erforderlich sind, wenn das DOM bereit ist.

    
Floris 21.12.2017 08:55
quelle

Tags und Links