Peki bu cevap mı?
"Bir şeyi hesaplamanız gerekiyor, ancak göstermiyorsanız, öğeyi visibility:hidden
ve olarak ayarlayın, position:absolute
DOM ağacına ekleyin, offsetHeight'ı alın ve kaldırın. (Prototip kütüphanesi son kontrol ettiğim satırların arkasında bunu yapar)."
Aynı sorun bir dizi unsurda da var. Sitede kullanılacak jQuery veya Prototype yok ama eğer işe yararsa tekniği ödünç almaktan yanayım. Çalışamayan bazı şeylerin bir örneği olarak, ardından ne yaptı, ben aşağıdaki kodu var:
// Layout Height Get
function fnElementHeightMaxGet(DoScroll, DoBase, elementPassed, elementHeightDefault)
{
var DoOffset = true;
if (!elementPassed) { return 0; }
if (!elementPassed.style) { return 0; }
var thisHeight = 0;
var heightBase = parseInt(elementPassed.style.height);
var heightOffset = parseInt(elementPassed.offsetHeight);
var heightScroll = parseInt(elementPassed.scrollHeight);
var heightClient = parseInt(elementPassed.clientHeight);
var heightNode = 0;
var heightRects = 0;
//
if (DoBase) {
if (heightBase > thisHeight) { thisHeight = heightBase; }
}
if (DoOffset) {
if (heightOffset > thisHeight) { thisHeight = heightOffset; }
}
if (DoScroll) {
if (heightScroll > thisHeight) { thisHeight = heightScroll; }
}
//
if (thisHeight == 0) { thisHeight = heightClient; }
//
if (thisHeight == 0) {
// Dom Add:
// all else failed so use the protype approach...
var elBodyTempContainer = document.getElementById('BodyTempContainer');
elBodyTempContainer.appendChild(elementPassed);
heightNode = elBodyTempContainer.childNodes[0].offsetHeight;
elBodyTempContainer.removeChild(elementPassed);
if (heightNode > thisHeight) { thisHeight = heightNode; }
//
// Bounding Rect:
// Or this approach...
var clientRects = elementPassed.getClientRects();
heightRects = clientRects.height;
if (heightRects > thisHeight) { thisHeight = heightRects; }
}
//
// Default height not appropriate here
// if (thisHeight == 0) { thisHeight = elementHeightDefault; }
if (thisHeight > 3000) {
// ERROR
thisHeight = 3000;
}
return thisHeight;
}
temelde her şeyi dener ve sadece sıfır sonuç almak için her şeyi dener. Etkisi olmayan ClientHeight. Sorunlu elemanlarla tipik olarak Tabanda NaN, Ofset ve Kaydırma yüksekliklerinde sıfır elde ederim. Daha sonra burada çalışıp çalışmadığını görmek için DOM çözümü ve clientRects ekle denedim.
29 Haz 2011, gerçekten DOM ve clientHeight eklemeyi beklediğimden daha iyi sonuçlarla eklemek için kodu güncelledim.
1) clientHeight da 0 idi.
2) Dom aslında bana büyük bir yükseklik verdi.
3) ClientRects, DOM tekniğiyle neredeyse aynı sonucu döndürür.
Eklenen elemanlar doğada akışkan olduklarından, aksi takdirde boş bir DOM Temp elemanına eklendiğinde, bu kabın genişliğine göre oluşturulurlar. Bu garipleşiyor, çünkü sonunda 30 piksel daha kısa.
Yüksekliğin nasıl farklı hesaplandığını göstermek için birkaç anlık görüntü ekledim.
Yükseklik farkları açıktır. Kesinlikle mutlak konumlandırma ve gizli ekleyebilirim ama bunun bir etkisi olmayacağından eminim. Bunun işe yaramayacağına ikna olmaya devam ettim!
(Daha fazla inceliyorum) Yükseklik gerçek görüntülenen yükseklikten daha düşük çıkıyor (çıkıyor). Bu, DOM Temp öğesinin genişliği mevcut üst öğeyle eşleşecek şekilde ayarlanarak ele alınabilir ve teoride oldukça doğru bir şekilde yapılabilir. Ayrıca bunları kaldırıp mevcut konumlarına geri eklemekten ne elde edeceğimi de bilmiyorum. Bir innerHTML tekniği ile geldiklerinde bu farklı yaklaşımı kullanarak bakacağım.
* ANCAK * Hiçbiri gerekli değildi. Aslında reklamı olarak çalıştı ve doğru yüksekliği döndü !!!
Menüleri tekrar şaşırtıcı bir şekilde görünür hale getirebildiğimde, DOM sayfanın üstündeki sıvı düzeni başına doğru yüksekliği döndürmüştü (279 piksel). Yukarıdaki kod ayrıca 280 piksel döndüren getClientRects kullanır.
Bu, aşağıdaki anlık görüntüde gösterilmiştir (çalıştıktan sonra Chrome'dan alınır.)
Şimdi bu prototip hilesinin neden işe yaradığına dair hiçbir fikrim yok, ama öyle görünüyor. Alternatif olarak, getClientRects de çalışır.
Tüm bu sorunların nedeninin bu belirli unsurlarla nedeninin appendChild yerine innerHTML kullanımı olduğundan şüpheleniyorum, ancak bu noktada saf spekülasyon.