Ich habe tatsächlich manchmal auf ein paar Tricks zurückgegriffen, um damit umzugehen. Ich habe ein jQuery-Bildlaufleisten-Widget entwickelt, bei dem ich auf das Problem gestoßen bin, dass ich nicht im Voraus weiß, ob der scrollbare Inhalt Teil eines versteckten Markups ist oder nicht. Folgendes habe ich getan:
// try to grab the height of the elem
if (this.element.height() > 0) {
var scroller_height = this.element.height();
var scroller_width = this.element.width();
// if height is zero, then we're dealing with a hidden element
} else {
var copied_elem = this.element.clone()
.attr("id", false)
.css({visibility:"hidden", display:"block",
position:"absolute"});
$("body").append(copied_elem);
var scroller_height = copied_elem.height();
var scroller_width = copied_elem.width();
copied_elem.remove();
}
Dies funktioniert größtenteils, aber es gibt ein offensichtliches Problem, das möglicherweise auftreten kann. Wenn der Inhalt, den Sie klonen, mit CSS gestaltet ist, dessen Regeln Verweise auf übergeordnetes Markup enthalten, enthält der geklonte Inhalt nicht das entsprechende Design und weist wahrscheinlich leicht unterschiedliche Maße auf. Um dies zu umgehen, können Sie sicherstellen, dass auf das Markup, das Sie klonen, CSS-Regeln angewendet werden, die keine Verweise auf das übergeordnete Markup enthalten.
Dies ist mir bei meinem Scroller-Widget auch nicht aufgefallen. Um jedoch die entsprechende Höhe des geklonten Elements zu erhalten, müssen Sie die Breite auf die gleiche Breite des übergeordneten Elements einstellen. In meinem Fall wurde immer eine CSS-Breite auf das eigentliche Element angewendet, sodass ich mir darüber keine Gedanken machen musste. Wenn auf das Element jedoch keine Breite angewendet wird, müssen Sie möglicherweise eine Art Rekursiv ausführen Durchlaufen der DOM-Abstammung des Elements, um die Breite des entsprechenden übergeordneten Elements zu ermitteln.