ดังนั้นนี่คือคำตอบ?
ถ้าคุณต้องการคำนวณบางอย่าง แต่ไม่แสดงให้ตั้งค่าองค์ประกอบเป็นvisibility:hidden
และposition:absolute
เพิ่มลงในทรี DOM รับ offsetHeight และลบออก (นั่นคือสิ่งที่ไลบรารีต้นแบบทำอยู่หลังบรรทัดสุดท้ายที่ฉันตรวจสอบ)"
ฉันมีปัญหาเดียวกันกับองค์ประกอบหลายอย่าง ไม่มี jQuery หรือ Prototype ที่จะใช้บนเว็บไซต์ แต่ฉันทุกคนชอบที่จะยืมเทคนิคถ้ามันใช้งานได้ ตัวอย่างของบางสิ่งที่ล้มเหลวในการทำงานตามด้วยสิ่งที่ทำฉันมีรหัสต่อไปนี้:
// 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;
}
ซึ่งโดยทั่วไปจะพยายามทำทุกอย่างเพื่อให้ได้ผลลัพธ์เป็นศูนย์ ความสูงของลูกค้าที่ไม่มีผลกระทบ ด้วยองค์ประกอบของปัญหาฉันมักจะได้ NaN ในฐานและศูนย์ในระดับความสูงออฟเซ็ตและสโคร ฉันลองใช้โซลูชันเพิ่ม DOM และ clientRects เพื่อดูว่าทำงานได้ที่นี่หรือไม่
29 มิ.ย. 2011 ฉันได้ทำการปรับปรุงรหัสเพื่อลองทั้งการเพิ่มใน DOM และ clientHeight ด้วยผลลัพธ์ที่ดีกว่าที่ฉันคาดไว้
1) ลูกค้าความสูงเป็น 0
2) Dom ให้ความสูงแก่ฉันซึ่งเยี่ยมมาก
3) ClientRects ส่งคืนผลลัพธ์ที่เกือบจะเหมือนกับเทคนิค DOM
เนื่องจากองค์ประกอบที่เพิ่มเป็นของเหลวในธรรมชาติเมื่อมีการเพิ่มองค์ประกอบ DOM ชั่วคราวว่างเปล่าพวกเขาจะแสดงผลตามความกว้างของภาชนะที่ สิ่งนี้ดูแปลกเพราะนั่นสั้นกว่า 30px ในที่สุด
ฉันเพิ่มภาพรวมเล็กน้อยเพื่อแสดงให้เห็นว่าการคำนวณความสูงแตกต่างกันอย่างไร
ความแตกต่างของความสูงนั้นชัดเจน ฉันสามารถเพิ่มตำแหน่งแน่นอนและซ่อนเร้นได้ แต่ฉันแน่ใจว่าจะไม่มีผลกระทบ ฉันยังคงเชื่อมั่นว่านี่จะไม่ทำงาน!
(ฉันพูดนอกเรื่องเพิ่มเติม) ความสูงออกมา (แสดงผล) ต่ำกว่าความสูงที่แสดงผลจริง สิ่งนี้สามารถแก้ไขได้โดยการตั้งค่าความกว้างขององค์ประกอบ DOM ชั่วคราวเพื่อให้ตรงกับผู้ปกครองที่มีอยู่และสามารถทำได้อย่างถูกต้องในทางทฤษฎี ฉันไม่ทราบด้วยว่าจะมีอะไรเกิดขึ้นในการลบออกและเพิ่มกลับเข้าไปในตำแหน่งที่มีอยู่เดิม เมื่อพวกเขามาถึงเทคนิค InnerHTML ฉันจะมองใช้วิธีการที่แตกต่างกันนี้
* อย่างไร *ไม่มีสิ่งที่จำเป็น ในความเป็นจริงมันทำงานตามโฆษณาและคืนความสูงที่ถูกต้อง !!!
เมื่อฉันสามารถทำให้เมนูมองเห็นได้อีกครั้งอย่างน่าอัศจรรย์ DOM ได้คืนค่าความสูงที่ถูกต้องต่อเลย์เอาต์ของเหลวที่ด้านบนของหน้า (279px) รหัสข้างต้นยังใช้ getClientRects ซึ่งผลตอบแทน 280px
นี่คือภาพประกอบในภาพรวมต่อไปนี้ (นำมาจาก Chrome เมื่อใช้งานได้)
ตอนนี้ฉันมีความคิด noooooo ทำไมต้นแบบต้นแบบนั้นทำงานได้ แต่ดูเหมือนว่า หรือมิฉะนั้น getClientRects ก็ใช้ได้เช่นกัน
ฉันสงสัยว่าสาเหตุของปัญหาทั้งหมดที่เกิดขึ้นกับองค์ประกอบเหล่านี้คือการใช้ InnerHTML แทนภาคผนวกเด็ก แต่นั่นเป็นการคาดเดาที่บริสุทธิ์ ณ จุดนี้