ฉันจะรับพาเรนต์ระดับที่ n ขององค์ประกอบใน jQuery ได้อย่างไร


151

เมื่อฉันต้องการได้รับเช่นผู้ปกครองระดับที่ 3 ขององค์ประกอบที่ฉันต้องเขียน$('#element').parent().parent().parent()มีวิธีที่เหมาะสมกว่านี้?


2
ฉันต้องการให้หมายเลข (ระดับ) เท่านั้นและรับองค์ประกอบเนื่องจากองค์ประกอบของฉันอาจไม่มีรหัสหรือชื่อ calss
Artur Keyan

1
หากคุณวางแผนที่จะใช้ฟังก์ชันการทำงานนี้อีกครั้งทางออกที่ดีที่สุดคือการสร้างปลั๊กอิน jQuery
zzzzBov

3
ดูjsperf.com/jquery-get-3rd-level-parentเพื่อเปรียบเทียบประสิทธิภาพ
a'r

1
เครื่องมือที่ดีอีกอย่างคือฟังก์ชั่น ".closest ()" $ ('li.item'). ที่ใกล้ที่สุด ('div') จะให้ DIV ที่เป็นบรรพบุรุษที่ใกล้ที่สุดของ li.item ดีสำหรับเมื่อคุณไม่ทราบว่าองค์ประกอบมีกี่ระดับ แต่คุณรู้ถึงชื่อ / คลาส / สิ่งอื่น
เกรแฮม

คำตอบ:


267

เนื่องจากparent ()ส่งคืนองค์ประกอบบรรพบุรุษที่เรียงลำดับจากใกล้เคียงกับองค์ประกอบด้านนอกมากที่สุดคุณสามารถโยงมันเข้ากับeq () :

$('#element').parents().eq(0);  // "Father".
$('#element').parents().eq(2);  // "Great-grandfather".

ฉันสามารถใช้ $ ('# element'). parent () [2] ได้อย่างไร หรือจะต้องด้วย eq (2)
Artur Keyan

1
นี้จะไม่ทำงานสำหรับการเลือกองค์ประกอบหลายวิธีที่ปลอดภัยจะเป็น:$('.element').first().parents().eq(num);
zzzzBov

6
@Arthur การใช้[2]จะส่งคืนองค์ประกอบ DOM พื้นฐานการใช้eq(2)จะส่งคืนวัตถุ jQuery
Frédéric Hamidi

1
@zzzzBov จริงมาก แต่จะมีเพียงหนึ่งองค์ประกอบที่เลือกในกรณีของผู้ถาม (เพราะเขาตรงกับ ID)
Frédéric Hamidi

หากคุณค้นหา id "#element" มันจะส่งคืนองค์ประกอบเดียวเท่านั้นเนื่องจากเป็นวิธีการทำงานของ ID การค้นหาพวกเขาจะคืนองค์ประกอบแรกด้วย ID นั้นใน dom ถ้าในอีกแง่หนึ่งคุณทำ "div # element" หรือตัวเลือกคลาสคุณจะพูดถูก
เฮนรี่

29

ขึ้นอยู่กับความต้องการของคุณหากคุณรู้ว่าสิ่งที่ผู้ปกครองของคุณกำลังมองหาคุณสามารถใช้ตัวเลือก. parents ()

EG: http://jsfiddle.net/HenryGarle/Kyp5g/2/

<div id="One">
    <div id="Two">
        <div id="Three">
            <div id="Four">

            </div>
        </div>
    </div>
</div>


var top = $("#Four").parents("#One");

alert($(top).html());

ตัวอย่างการใช้ดัชนี:

//First parent - 2 levels up from #Four
// I.e Selects div#One
var topTwo = $("#Four").parents().eq(2);

alert($(topTwo ).html());

ตอนนี้ฉันเป็นแบบนี้ แต่ฉันต้องการให้ระดับ
Artur Keyan

3
อ่านคำตอบต่อไปและทั้งหมดจะถูกเปิดเผย! (ฉันยกตัวอย่างระดับให้คุณ)
Henry

วิธีนี้ใช้ได้ผลกับตัวเลือกชนิดอื่น ๆ ทั้งหมด ตัวอย่างเช่นหากคุณต้องการรายชื่อผู้ปกครองทั้งหมดและผู้ปกครองของผู้ปกครองที่มีชั้นเรียนหนึ่งนี้จะส่งคืนพวกเขา
darksky

8

คุณสามารถให้ id หรือคลาสของผู้ปกครองเป้าหมาย (เช่น myParent) และอ้างอิงด้วย $('#element').parents(".myParent")


ฉันต้องการให้หมายเลขเท่านั้นและรับองค์ประกอบเพราะองค์ประกอบของฉันอาจไม่มีรหัสหรือชื่อ calss
Artur Keyan

6

วิธีที่เร็วกว่าคือการใช้จาวาสคริปต์โดยตรงเช่น

var parent = $(innerdiv.get(0).parentNode.parentNode.parentNode);

สิ่งนี้ทำงานบนเบราว์เซอร์ของฉันเร็วกว่าการโยง.parent()สายjQuery อย่างมีนัยสำคัญ

ดู: http://jsperf.com/jquery-get-3rd-level-parent


โดย "เร็วกว่าอย่างมาก" เรากำลังดูลำดับความสำคัญในแง่ของความแตกต่างของความเร็ว (เรียกใช้ jQuery 1.10.1 บน Chrome 51) การใช้งานนั้นคุ้มค่าอย่างแน่นอนหากคุณกำลังปรับความเร็ว
เฟนเฟรเซอร์

5

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

('#element').closest('div')    // returns the innermost 'div' in its parents
('#element').closest('.container')    // returns innermost element with 'container' class among parents
('#element').closest('#foo')    // returns the closest parent with id 'foo'

3

มันง่ายมาก เพียงแค่ใช้

$(selector).parents().eq(0); 

โดยที่ 0 คือระดับพาเรนต์ (0 คือพาเรนต์ 1 คือพาเรนต์ของพาเรนต์เป็นต้น)


3

เพียงเพิ่ม:eq()ตัวเลือกดังนี้:

$("#element").parents(":eq(2)")

คุณเพียงแค่ระบุดัชนีที่ผู้ปกครอง: 0 สำหรับผู้ปกครองทันที 1 สำหรับผู้ปกครอง ...


วิธีนี้เป็นวิธีที่เร็วที่สุดในการทำงานให้สำเร็จ นี่คือมาตรฐานในการพิสูจน์: jsperf.com/jquery-get-element-s-nth-parent
java-man-script

3

หากคุณวางแผนที่จะใช้ฟังก์ชันการทำงานนี้อีกครั้งทางออกที่ดีที่สุดคือการสร้างปลั๊กอิน jQuery:

(function($){
$.fn.nthParent = function(n){
  var $p = $(this);
  while ( n-- >= 0 )
  {
    $p = $p.parent();
  }
  return $p;
};
}(jQuery));

แน่นอนคุณอาจต้องการขยายเพื่อให้ตัวเลือกเพิ่มเติมและสิ่งอื่น ๆ

หนึ่งหมายเหตุ: นี้ใช้เป็น0ดัชนีที่ใช้สำหรับพ่อแม่ผู้ปกครองจึงเป็นเช่นเดียวกับการเรียกnthParent(0) parent()หากคุณต้องการ1จัดทำดัชนีโดยใช้n-- > 0


ฉันคิดว่าคุณจะพบส่วนนี้เร็วขึ้น: var p = 1 + n; while (p--) { $p = $p.parent(); }และหากคุณต้องการเปลี่ยนเป็น 1 ตามจาวาสคริปต์เป็น "falsey" คุณสามารถใช้: while (n--) { $p = $p.parent();} บันทึกการตรวจสอบตามเงื่อนไข
Mark Schultheiss

@ Mark Schultheiss ไม่เพียง แต่เกี่ยวกับความเร็วเท่านั้น แต่ยังมีความน่าเชื่อถืออีกด้วย เกิดอะไรขึ้นกับการทำงานของคุณถ้ามีคนโง่เรียกnthParent(-2)? ตัวอย่างของคุณเสีย
zzzzBov

หรือเพิ่งกลับมา(function($) { $.fn.nthParent = function(n) { return $(this).parents().eq(n); }; }(jQuery));
Mark Schultheiss

@ Mark Schultheiss อีกครั้งน่าเชื่อถือ ฟังก์ชั่นของฉันจะส่งกลับ nthParent สำหรับทุกองค์ประกอบในการเลือกฟังก์ชั่นของคุณจะส่งกลับองค์ประกอบที่ n ในรายการparentsซึ่งจะไม่ถูกต้องสำหรับการเลือกที่มีมากกว่าหนึ่งองค์ประกอบ
zzzzBov

จริงเกี่ยวกับ -2 และเป็นตัวอย่างของคุณโดยใช้var p = n >? (1 + n):1; แทนจะกลับผู้ปกครองคนแรกในกรณีนั้นมากกว่า "ไม่มีอะไร" - หรือที่มันทำลายวงในตัวอย่างของฉัน ดังนั้นมันควรจะเป็น: (function($) { $.fn.nthParent = function(n) { var $p = $(this); if (!(n > -0)) { return $() }; var p = 1 + n; while (p--) { $p = $p.parent(); } return $p; }; }(jQuery)); ถ้าคุณไม่ต้องการคืนอะไร
Mark Schultheiss

3

หากคุณมี div ปกครองทั่วไปที่คุณสามารถใช้ parentsUntil () การเชื่อมโยง

เช่น: $('#element').parentsUntil('.commonClass')

ข้อได้เปรียบคือคุณไม่จำเป็นต้องจำจำนวนการสร้างระหว่างองค์ประกอบนี้กับพาเรนต์ทั่วไป (กำหนดโดย Commonclass)



0

คุณสามารถใช้สิ่งนี้:

(function($) {
    $.fn.parentNth = function(n) {
        var el = $(this);
        for(var i = 0; i < n; i++)
            el = el.parent();

        return el;
    };
})(jQuery);

alert($("#foo").parentNth(2).attr("id"));

http://jsfiddle.net/Xeon06/AsNUu/


1
ไม่ใช่ downvoter แต่นี่อาจเป็นทางออกที่แย่ที่สุด (เช่นไม่มีประสิทธิภาพ) ที่นี่
zatatatata

0

ใช้ eq ดูเหมือนจะคว้า DOM แบบไดนามิกในขณะที่ใช้. parent (). parent () ดูเหมือนจะคว้า DOM ที่ถูกโหลดครั้งแรก (ถ้าเป็นไปได้)

ฉันใช้พวกเขาทั้งสองในองค์ประกอบที่มีชั้นเรียนนำไปใช้กับ onmouseover eq แสดงคลาสในขณะที่. parent (). parent () ไม่


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