jQuery: รับส่วนสูงขององค์ประกอบที่ซ่อนอยู่ใน jQuery


249

ฉันต้องได้ความสูงขององค์ประกอบที่อยู่ใน div ที่ถูกซ่อนอยู่ ตอนนี้ฉันแสดง div รับส่วนสูงและซ่อน div parent มันดูโง่ไปหน่อย มีวิธีที่ดีกว่า?

ฉันใช้ jQuery 1.4.2:

$select.show();
optionHeight = $firstOption.height(); //we can only get height if its visible
$select.hide();

42
+1 โซลูชันตัวอย่างของคุณดีกว่าคำตอบใด ๆ จริง ๆ
ทิม Santeford

9
ฉันไม่เห็นด้วยทิม ด้วยวิธีนี้มีโอกาสที่จอภาพอาจสั่นเพราะคุณแสดงรายการแล้วซ่อน แม้ว่าโซลูชันของ Nicks จะซับซ้อนมากขึ้น แต่ก็ไม่มีโอกาสที่จะกะพริบจอแสดงผลเนื่องจาก div หลักไม่เคยแสดง
Humphrey


เกี่ยวข้อง: stackoverflow.com/questions/3632120/…
Nick

5
แฮร์รี่สิ่งที่คุณรู้คือรหัสของคุณไม่ทำงานใน IE ไม่ใช่ทางออกนี้ ไปแก้ปัญหารหัสของคุณ :)
Gavin

คำตอบ:


181

คุณสามารถทำอะไรแบบนี้แฮ็กไปหน่อยลืมไปpositionเลยว่ามันสมบูรณ์แล้ว:

var previousCss  = $("#myDiv").attr("style");

$("#myDiv").css({
    position:   'absolute', // Optional if #myDiv is already absolute
    visibility: 'hidden',
    display:    'block'
});

optionHeight = $("#myDiv").height();

$("#myDiv").attr("style", previousCss ? previousCss : "");

17
ฉันรวมรหัสดังกล่าวข้างต้นเป็น JQ ปลั๊กอินjsbin.com/ihakid/2 ฉันใช้คลาสและตรวจสอบว่าผู้ปกครองซ่อนอยู่หรือไม่
hitautodestruct

3
+1 มันใช้งานได้ดี เพียงจำผู้ปกครองขององค์ประกอบจะต้องแสดงเช่นกัน สิ่งนี้ทำให้ฉันสับสนในเวลาไม่กี่นาที นอกจากนี้ถ้าองค์ประกอบคือคุณจะแน่นอนต้องการชุดว่าหลังจากแทนposition:relative static
Michael Mior

6
เมื่อคุณใช้วิธีนี้องค์ประกอบเป้าหมายมักจะสามารถเปลี่ยนรูปร่างได้ ดังนั้นการรับความสูงและ / หรือความกว้างของ div เมื่อตำแหน่งที่แน่นอนอาจไม่มีประโยชน์มาก
Jeremy Ricketts

2
@ กาวินสิ่งนี้จะช่วยป้องกันการคำนวณการไหลย้อนกลับและการสั่นไหวใด ๆ ต่อผู้ใช้ดังนั้นจึงมีทั้งราคาถูกและรบกวนน้อยกว่า
Nick Craver

2
@hitautodestruct ฉันได้แก้ไขปลั๊กอินข้อความค้นหาของคุณเพื่อตรวจสอบสิ่งนี้เฉพาะองค์ประกอบที่ถูกซ่อนอยู่จริงๆ jsbin.com/ihakid/58
Prasad

96

ฉันพบปัญหาเดียวกันกับการซ่อนความกว้างขององค์ประกอบดังนั้นฉันจึงเขียนปลั๊กอินนี้เรียกjQuery Actualเพื่อแก้ไข แทนที่จะใช้

$('#some-element').height();

ใช้

$('#some-element').actual('height');

จะให้ค่าที่ถูกต้องสำหรับองค์ประกอบที่ซ่อนอยู่หรือองค์ประกอบที่มีผู้ปกครองที่ซ่อนอยู่

เอกสารฉบับเต็มโปรดดูที่นี่ นอกจากนี้ยังมีการสาธิตรวมอยู่ในหน้า

หวังว่าความช่วยเหลือนี้ :)


3
ใช่มันช่วย! 2558 และมันยังช่วย คุณพูดว่า "jquery รุ่นเก่ากว่า" บนเว็บไซต์จริง - อย่างไรก็ตาม - มันยังคงต้องการใน v2.1.3 อย่างน้อยก็เป็นสถานการณ์ของฉัน
LpLrich

ขอบคุณ! ฉันใช้ปลั๊กอินนี้เพื่ออ่านและตั้งค่าความสูงขององค์ประกอบ (จะทำแบบไดนามิก) ที่ซ่อนอยู่เริ่มแรกภายในหีบเพลง
alds

ปลั๊กอินสุดยอด! ฉันพยายามทุกอย่างเพื่อให้ได้ความกว้างของ div ภายใน modal เมื่อตั้งค่าเป็น 100% และไม่มีอะไรทำงาน ตั้งค่านี้ใน 5 วินาทีและทำงานได้อย่างสมบูรณ์แบบ!
Craig Howell

@ben ลิงก์เสีย
Sachin Prasad

39

คุณกำลัง confuising สองรูปแบบ CSS ที่รูปแบบการแสดงและรูปแบบการแสดงผล

ถ้าองค์ประกอบจะถูกซ่อนไว้โดยการตั้งค่ารูปแบบการแสดงผล CSS แล้วคุณควรจะสามารถที่จะได้รับความสูงโดยไม่คำนึงถึงหรือไม่ว่าองค์ประกอบที่จะมองเห็นได้หรือไม่เป็นองค์ประกอบยังคงใช้พื้นที่บนหน้าเว็บ

หากองค์ประกอบถูกซ่อนไว้โดยการเปลี่ยนสไตล์การแสดงผล css เป็น "none" องค์ประกอบนั้นจะไม่ใช้พื้นที่ในหน้าและคุณจะต้องให้รูปแบบการแสดงผลซึ่งจะทำให้องค์ประกอบการแสดงผลในบางพื้นที่ที่ จุดไหนคุณจะได้ส่วนสูง


ขอบคุณสำหรับสิ่งนี้. ปัญหาของฉันเกี่ยวข้องกับเซลล์ตารางและการตั้งค่าvisibilityที่hiddenไม่สามารถแก้ปัญหาของฉันได้ แต่มันทำให้ฉันมีความคิดที่จะตั้งค่าposition: fixed; top: 100%และใช้งานได้อย่างมีเสน่ห์!
Jayen

ตอนนี้ฉันเข้าใจแล้วว่าทำไมความสูงถึงไม่แสดงพร้อมจอแสดงผล: ไม่มีองค์ประกอบ ขอบคุณมากสำหรับคำอธิบายที่ยอดเยี่ยม
FrenkyB

30

จริง ๆ แล้วฉันเคยใช้กลอุบายเพื่อจัดการกับเรื่องนี้ในบางครั้ง ฉันพัฒนาวิดเจ็ตแถบเลื่อน jQuery ซึ่งฉันพบปัญหาที่ฉันไม่ทราบล่วงหน้าหากเนื้อหาที่เลื่อนได้เป็นส่วนหนึ่งของมาร์กอัปที่ซ่อนอยู่หรือไม่ นี่คือสิ่งที่ฉันทำ:

// 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();
}

ส่วนใหญ่ใช้งานได้ แต่มีปัญหาชัดเจนที่อาจเกิดขึ้นได้ หากเนื้อหาที่คุณโคลนนั้นมีสไตล์ด้วย CSS ที่มีการอ้างอิงถึงมาร์กอัปแม่แบบในกฎของพวกเขาเนื้อหาที่โคลนจะไม่มีสไตล์ที่เหมาะสมและอาจมีการวัดที่แตกต่างกันเล็กน้อย ในการหลีกเลี่ยงสิ่งนี้คุณสามารถตรวจสอบให้แน่ใจว่ามาร์กอัปที่คุณโคลนนั้นมีการใช้กฎ CSS ที่ไม่รวมการอ้างอิงถึงมาร์กอัปหลัก

นอกจากนี้สิ่งนี้ไม่ได้เกิดขึ้นกับฉันด้วยวิดเจ็ต scroller ของฉัน แต่เพื่อให้ได้ความสูงที่เหมาะสมขององค์ประกอบโคลนคุณจะต้องตั้งค่าความกว้างเป็นความกว้างเดียวกันขององค์ประกอบหลัก ในกรณีของฉันความกว้างของ CSS ถูกนำไปใช้กับองค์ประกอบจริงเสมอดังนั้นฉันไม่ต้องกังวลเกี่ยวกับสิ่งนี้อย่างไรก็ตามหากองค์ประกอบนั้นไม่มีความกว้างที่ใช้กับมันคุณอาจต้องเรียกใช้ซ้ำ การแวะผ่านของบรรพบุรุษ DOM ขององค์ประกอบเพื่อค้นหาความกว้างขององค์ประกอบหลักที่เหมาะสม


นี่เป็นปัญหาที่น่าสนใจ หากองค์ประกอบนั้นเป็นองค์ประกอบบล็อกอยู่แล้ว clone จะใช้ความกว้างของร่างกายทั้งหมด (ยกเว้นการขยายตัวหรือระยะขอบ) ซึ่งแตกต่างจากขนาดภายในคอนเทนเนอร์
Meligy

16

สร้างเพิ่มเติมจากคำตอบของผู้ใช้ Nick และปลั๊กอิน hitautodestruct ของผู้ใช้บน JSBin ฉันได้สร้างปลั๊กอิน jQuery ที่คล้ายกันซึ่งดึงทั้งความกว้างและความสูงและส่งคืนวัตถุที่มีค่าเหล่านี้

พบได้ที่นี่: http://jsbin.com/ikogez/3/

ปรับปรุง

ฉันได้ออกแบบปลั๊กอินตัวเล็ก ๆ ตัวนี้ขึ้นมาใหม่อย่างสมบูรณ์เนื่องจากมันกลับกลายเป็นว่าเวอร์ชั่นก่อนหน้า (ดังกล่าวข้างต้น) ไม่สามารถใช้งานได้จริงในสภาพแวดล้อมในชีวิตจริงที่มีการจัดการ DOM เกิดขึ้นมากมาย

มันทำงานได้อย่างสมบูรณ์แบบ:

/**
 * getSize plugin
 * This plugin can be used to get the width and height from hidden elements in the DOM.
 * It can be used on a jQuery element and will retun an object containing the width
 * and height of that element.
 *
 * Discussed at StackOverflow:
 * http://stackoverflow.com/a/8839261/1146033
 *
 * @author Robin van Baalen <robin@neverwoods.com>
 * @version 1.1
 * 
 * CHANGELOG
 *  1.0 - Initial release
 *  1.1 - Completely revamped internal logic to be compatible with javascript-intense environments
 *
 * @return {object} The returned object is a native javascript object
 *                  (not jQuery, and therefore not chainable!!) that
 *                  contains the width and height of the given element.
 */
$.fn.getSize = function() {    
    var $wrap = $("<div />").appendTo($("body"));
    $wrap.css({
        "position":   "absolute !important",
        "visibility": "hidden !important",
        "display":    "block !important"
    });

    $clone = $(this).clone().appendTo($wrap);

    sizes = {
        "width": $clone.width(),
        "height": $clone.height()
    };

    $wrap.remove();

    return sizes;
};

รหัสของคุณไม่ถูกต้อง คุณต้องหมายถึงรายการเดิมซึ่งไม่สามารถมองเห็น sizes = {"width": $wrap.width(), "height": $wrap.height()};this
jackJoe

@jackJoe ฉันใช้รหัสนี้มาระยะหนึ่งแล้วโดยไม่มีปัญหา ที่ดีที่สุดฉันจะบอกว่าฉันต้องการ $ clone.width () แทน 'this' ไม่ใช่ $ wrap เนื่องจากฉันต้องการขนาดขององค์ประกอบภายในห่อ Wrapper อาจเป็น 10,000x10000px ในขณะที่องค์ประกอบที่ฉันต้องการวัดยังคงเป็น 30x40px
Robin van Baalen

แม้แต่การตั้งเป้าหมาย$wrapก็โอเค (อย่างน้อยในการทดสอบของฉัน) ฉันลองด้วยthisและเห็นได้ชัดว่ามันจะไม่จับขนาดเพราะthisยังหมายถึงองค์ประกอบที่ซ่อนอยู่
jackJoe

1
ขอบคุณ @jackJoe ฉันได้อัปเดตตัวอย่างโค้ดแล้ว
Robin van Baalen

12

สร้างเพิ่มเติมจากคำตอบของ Nick:

$("#myDiv").css({'position':'absolute','visibility':'hidden', 'display':'block'});
optionHeight = $("#myDiv").height();
$("#myDiv").css({'position':'static','visibility':'visible', 'display':'none'});

ฉันพบว่าการทำเช่นนี้ดีกว่า:

$("#myDiv").css({'position':'absolute','visibility':'hidden', 'display':'block'});
optionHeight = $("#myDiv").height();
$("#myDiv").removeAttr('style');

การตั้งค่าแอตทริบิวต์ CSS จะแทรกแบบอินไลน์ซึ่งจะเขียนทับคุณลักษณะอื่น ๆ ที่คุณมีในไฟล์ CSS ของคุณ โดยการลบคุณลักษณะสไตล์ในองค์ประกอบ HTML ทุกอย่างกลับสู่ปกติและยังคงซ่อนอยู่เนื่องจากถูกซ่อนตั้งแต่แรก


1
$("#myDiv").css({'position':'absolute','visibility':'hidden', 'display':'block'}); optionHeight = $("#myDiv").height(); $("#myDiv").css({'position':'','visibility':'', 'display':''});
แอรอน

9
... เว้นแต่คุณจะมีรูปแบบอินไลน์ในองค์ประกอบ ซึ่งจะเป็นกรณีถ้าคุณซ่อนองค์ประกอบด้วย jQuery
Muhd

4

นอกจากนี้คุณยังสามารถวางตำแหน่ง div ที่ซ่อนอยู่บนหน้าจอด้วยระยะขอบลบแทนที่จะใช้การแสดงผล: ไม่มีเหมือนเทคนิคการแทนที่รูปภาพเยื้องข้อความ

เช่น.

position:absolute;
left:  -2000px;
top: 0;

วิธีนี้ความสูง () ยังคงมีอยู่


3

ฉันพยายามหาฟังก์ชั่นการทำงานสำหรับองค์ประกอบที่ซ่อนอยู่ แต่ฉันรู้ว่า CSS นั้นซับซ้อนกว่าทุกคนคิด มีเทคนิคเลย์เอาต์ใหม่มากมายใน CSS3 ที่อาจไม่สามารถใช้ได้กับคำตอบก่อนหน้านี้ทั้งหมดเช่นกล่องแบบยืดหยุ่นตารางคอลัมน์หรือแม้แต่องค์ประกอบภายในองค์ประกอบหลักที่ซับซ้อน

ตัวอย่าง flexibox ป้อนคำอธิบายรูปภาพที่นี่

ผมคิดว่าเพียงการแก้ปัญหาอย่างยั่งยืนและง่ายๆคือการแสดงผลแบบ real-time ในขณะที่เบราว์เซอร์ควรให้คุณทราบว่าขนาดขององค์ประกอบที่ถูกต้อง

น่าเศร้าที่ JavaScript ไม่ได้จัดให้มีเหตุการณ์โดยตรงใด ๆ ที่จะแจ้งเตือนเมื่อองค์ประกอบถูกแสดงหรือซ่อน อย่างไรก็ตามฉันสร้างฟังก์ชั่นบางอย่างจาก DOM Attribute API ที่แก้ไขแล้วซึ่งจะเรียกใช้ฟังก์ชันการโทรกลับเมื่อมีการเปลี่ยนแปลงองค์ประกอบที่มองเห็นได้

$('[selector]').onVisibleChanged(function(e, isVisible)
{
    var realWidth = $('[selector]').width();
    var realHeight = $('[selector]').height();

    // render or adjust something
});

สำหรับข้อมูลเพิ่มเติมกรุณาเยี่ยมชมที่โครงการของฉัน GitHub

https://github.com/Soul-Master/visible.event.js

ตัวอย่าง: http://jsbin.com/ETiGIre/7


ขอบคุณสำหรับคำตอบ. มันเป็นแรงบันดาลใจให้ฉันใช้ MutationObservers ด้วย แต่โปรดสังเกตว่าห้องสมุดของคุณตรวจสอบเฉพาะการเปลี่ยนแปลงการมองเห็นที่เกิดจากstyleการเปลี่ยนแปลงคุณสมบัติ (ดูบรรทัด 59 ที่นี่ ) ในขณะที่การเปลี่ยนแปลงการมองเห็นอาจเกิดจากการเปลี่ยนแปลงในclassแอตทริบิวต์
Ashraf Sabry

คุณถูก. ข้อความที่ถูกต้องควรเป็น e.attributeName! == 'style' && e.attributeName! == 'className'
Soul_Master

2

การติดตามโซลูชันของ Nick Craver การตั้งค่าการมองเห็นขององค์ประกอบช่วยให้ได้มิติที่ถูกต้อง ฉันใช้วิธีนี้บ่อยมาก อย่างไรก็ตามเมื่อต้องรีเซ็ตสไตล์ด้วยตนเองฉันพบว่ามันยุ่งยากเนื่องจากการแก้ไขตำแหน่งเริ่มต้น / การแสดงองค์ประกอบใน CSS ของฉันผ่านการพัฒนาฉันมักจะลืมปรับปรุงจาวาสคริปต์ที่เกี่ยวข้อง รหัสต่อไปนี้ไม่ได้รีเซ็ตรูปแบบต่อคำพูด แต่จะลบรูปแบบอินไลน์ที่เพิ่มโดยจาวาสคริปต์:

$("#myDiv")
.css({
    position:   'absolute',
    visibility: 'hidden',
    display:    'block'
});

optionHeight = $("#myDiv").height();
optionWidth = $("#myDiv").width();

$("#myDiv").attr('style', '');

ข้อสันนิษฐานเดียวที่นี่คือไม่สามารถมีสไตล์อินไลน์อื่น ๆ มิฉะนั้นพวกเขาจะถูกลบออกเช่นกัน อย่างไรก็ตามประโยชน์ที่นี่คือรูปแบบขององค์ประกอบจะกลับไปเป็นสิ่งที่พวกเขาอยู่ในสไตล์ชีท CSS ดังนั้นคุณสามารถเขียนสิ่งนี้ขึ้นเป็นฟังก์ชั่นที่องค์ประกอบถูกส่งผ่านและความสูงหรือความกว้างจะถูกส่งกลับ

อีกปัญหาที่ฉันได้พบในการตั้งค่าสไตล์แบบอินไลน์ผ่าน js คือเมื่อต้องรับมือกับการเปลี่ยนผ่าน css3 คุณจะถูกบังคับให้ปรับน้ำหนักกฎของสไตล์ของคุณให้แข็งแกร่งกว่าแบบอินไลน์ซึ่งอาจทำให้หงุดหงิดในบางครั้ง


1

ตามคำนิยามองค์ประกอบจะมีความสูงก็ต่อเมื่อสามารถมองเห็นได้

แค่อยากรู้: ทำไมคุณถึงต้องการความสูงขององค์ประกอบที่ซ่อนอยู่

ทางเลือกหนึ่งคือการซ่อนองค์ประกอบอย่างมีประสิทธิภาพโดยวางไว้ด้านหลัง (โดยใช้ดัชนี z) การซ้อนทับบางชนิด)


1
ฉันต้องการความสูงขององค์ประกอบที่ซ่อนอยู่ในช่วงเวลาที่ฉันต้องการความสูงของมัน ฉันกำลังสร้างปลั๊กอินและฉันต้องการรวบรวมข้อมูลบางอย่างเมื่อฉันเริ่มต้น
mkoryak

2
อีกเหตุผลหนึ่งคือการจัดศูนย์กลางสิ่งต่าง ๆ ด้วย javascript ที่อาจยังไม่ปรากฏให้เห็น
Simon_Weaver

@cletus หากคุณเพียงแค่อยากรู้อยากเห็นเขียนความคิดเห็นที่มักจะเป็นสถานการณ์ในการเข้ารหัสส่วนหน้าเพื่อให้ได้ขนาดขององค์ประกอบที่ซ่อนอยู่
Rantiev

1

ในกรณีของฉันฉันยังมีองค์ประกอบที่ซ่อนอยู่หยุดฉันจากการรับค่าความสูง แต่มันไม่ได้เป็นองค์ประกอบเอง แต่เป็นหนึ่งในนั้นคือพ่อแม่ ... ดังนั้นฉันแค่ใส่เช็คปลั๊กอินของฉันเพื่อดูว่ามันเป็นอย่างไร ซ่อนไว้มิฉะนั้นจะพบองค์ประกอบที่ซ่อนอยู่ใกล้เคียงที่สุด นี่คือตัวอย่าง:

var $content = $('.content'),
    contentHeight = $content.height(),
    contentWidth = $content.width(),
    $closestHidden,
    styleAttrValue,
    limit = 20; //failsafe

if (!contentHeight) {
    $closestHidden = $content;
    //if the main element itself isn't hidden then roll through the parents
    if ($closestHidden.css('display') !== 'none') { 
        while ($closestHidden.css('display') !== 'none' && $closestHidden.size() && limit) {
            $closestHidden = $closestHidden.parent().closest(':hidden');
            limit--;
        }
    }
    styleAttrValue = $closestHidden.attr('style');
    $closestHidden.css({
        position:   'absolute',
        visibility: 'hidden',
        display:    'block'
    });
    contentHeight = $content.height();
    contentWidth = $content.width();

    if (styleAttrValue) {
        $closestHidden.attr('style',styleAttrValue);
    } else {
        $closestHidden.removeAttr('style');
    }
}

ในความเป็นจริงนี่คือการรวมกันของการตอบสนองของ Nick, Gregory และ Eyelidlessness เพื่อให้คุณใช้วิธีการที่พัฒนาขึ้นของ Gregory แต่ใช้ทั้งสองวิธีในกรณีที่ควรจะมีบางสิ่งบางอย่างในแอตทริบิวต์ลักษณะที่คุณต้องการนำกลับมาและมองหา องค์ประกอบหลัก

สิ่งเดียวที่ฉันทำได้กับโซลูชันของฉันคือการวนลูปผ่านพ่อแม่ไม่ได้มีประสิทธิภาพทั้งหมด


1

วิธีแก้ปัญหาหนึ่งคือการสร้าง div parent นอกองค์ประกอบที่คุณต้องการให้ได้ความสูงใช้ความสูงเป็น '0' และซ่อนโอเวอร์โฟลว์ใด ๆ ถัดไปรับความสูงขององค์ประกอบลูกและลบคุณสมบัติโอเวอร์โฟลว์ของพาเรนต์

var height = $("#child").height();
// Do something here
$("#parent").append(height).removeClass("overflow-y-hidden");
.overflow-y-hidden {
  height: 0px;
  overflow-y: hidden;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="parent" class="overflow-y-hidden">
  <div id="child">
    This is some content I would like to get the height of!
  </div>
</div>


0

นี่คือสคริปต์ที่ฉันเขียนเพื่อจัดการกับมิติทั้งหมดของ jQuery สำหรับองค์ประกอบที่ซ่อนอยู่แม้กระทั่งลูกหลานของผู้ปกครองที่ซ่อนอยู่ โปรดทราบว่ามีการใช้งานสิ่งนี้อย่างมีประสิทธิภาพ

// Correctly calculate dimensions of hidden elements
(function($) {
    var originals = {},
        keys = [
            'width',
            'height',
            'innerWidth',
            'innerHeight',
            'outerWidth',
            'outerHeight',
            'offset',
            'scrollTop',
            'scrollLeft'
        ],
        isVisible = function(el) {
            el = $(el);
            el.data('hidden', []);

            var visible = true,
                parents = el.parents(),
                hiddenData = el.data('hidden');

            if(!el.is(':visible')) {
                visible = false;
                hiddenData[hiddenData.length] = el;
            }

            parents.each(function(i, parent) {
                parent = $(parent);
                if(!parent.is(':visible')) {
                    visible = false;
                    hiddenData[hiddenData.length] = parent;
                }
            });
            return visible;
        };

    $.each(keys, function(i, dimension) {
        originals[dimension] = $.fn[dimension];

        $.fn[dimension] = function(size) {
            var el = $(this[0]);

            if(
                (
                    size !== undefined &&
                    !(
                        (dimension == 'outerHeight' || 
                            dimension == 'outerWidth') &&
                        (size === true || size === false)
                    )
                ) ||
                isVisible(el)
            ) {
                return originals[dimension].call(this, size);
            }

            var hiddenData = el.data('hidden'),
                topHidden = hiddenData[hiddenData.length - 1],
                topHiddenClone = topHidden.clone(true),
                topHiddenDescendants = topHidden.find('*').andSelf(),
                topHiddenCloneDescendants = topHiddenClone.find('*').andSelf(),
                elIndex = topHiddenDescendants.index(el[0]),
                clone = topHiddenCloneDescendants[elIndex],
                ret;

            $.each(hiddenData, function(i, hidden) {
                var index = topHiddenDescendants.index(hidden);
                $(topHiddenCloneDescendants[index]).show();
            });
            topHidden.before(topHiddenClone);

            if(dimension == 'outerHeight' || dimension == 'outerWidth') {
                ret = $(clone)[dimension](size ? true : false);
            } else {
                ret = $(clone)[dimension]();
            }

            topHiddenClone.remove();
            return ret;
        };
    });
})(jQuery);

คำตอบด้วยการไม่มีเปลือกตาดูสมบูรณ์แบบสำหรับสิ่งที่ฉันต้องการ แต่ไม่ได้ทำงานกับ jQuery ที่ฉันใช้: 1.3.2 มันทำให้ jQuery ขว้าง this.clone (หรืออะไรที่ใกล้เคียง) ไม่ใช่ฟังก์ชั่น ใครมีความคิดเห็นเกี่ยวกับวิธีการแก้ไขหรือไม่

0

หากคุณเคยแสดงองค์ประกอบในหน้าก่อนหน้านี้คุณสามารถดึงความสูงได้โดยตรงจากองค์ประกอบ DOM (สามารถเข้าถึงได้ใน jQuery ด้วย. get (0)) เนื่องจากมีการตั้งค่าแม้ว่าองค์ประกอบจะถูกซ่อนอยู่:

$('.hidden-element').get(0).height;

สำหรับความกว้างเดียวกัน:

$('.hidden-element').get(0).width;

(ขอบคุณ Skeets O'Reilly สำหรับการแก้ไข)


ผลตอบแทนundefined
Jake Wilson

1
ค่อนข้างแน่ใจว่าใช้งานได้เฉพาะเมื่อคุณแสดงองค์ประกอบบนหน้าก่อนหน้านี้แล้ว สำหรับองค์ประกอบที่เคยเป็นdisplay='none'มาสิ่งนี้จะไม่ทำงาน
Skeets
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.