Czasami skorzystałem z odrobiny sztuczek, aby sobie z tym poradzić. Opracowałem widżet paska przewijania jQuery, w którym napotkałem problem, którego nie wiem z góry, czy zawartość przewijalna jest częścią ukrytego znacznika, czy nie. Oto co zrobiłem:
// 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();
}
Działa to w przeważającej części, ale istnieje oczywisty problem, który może potencjalnie się pojawić. Jeśli treść, którą klonujesz, jest stylizowana za pomocą CSS, który zawiera odniesienia do znaczników nadrzędnych w swoich regułach, sklonowana treść nie będzie zawierać odpowiedniego stylu i prawdopodobnie będzie miała nieco inne wymiary. Aby obejść ten problem, możesz upewnić się, że klonowane znaczniki mają zastosowane reguły CSS, które nie zawierają odniesień do znaczników nadrzędnych.
Ponadto nie przyszło mi to z moim widgetem przewijania, ale aby uzyskać odpowiednią wysokość sklonowanego elementu, musisz ustawić szerokość na tę samą szerokość elementu nadrzędnego. W moim przypadku szerokość CSS była zawsze stosowana do rzeczywistego elementu, więc nie musiałem się tym przejmować, jednak jeśli element nie ma zastosowanej szerokości, może być konieczne wykonanie pewnego rodzaju rekurencji przejście przez pochodzenie DOM elementu w celu znalezienia odpowiedniej szerokości elementu nadrzędnego.