วิธีรับลูกของตัวเลือก $ (อันนี้)?


2229

ฉันมีเค้าโครงคล้ายกับสิ่งนี้:

<div id="..."><img src="..."></div>

และต้องการใช้ตัวเลือก jQuery เพื่อเลือกลูกที่imgอยู่ภายในdivเมื่อคลิก

เพื่อให้ได้divฉันมีตัวเลือกนี้:

$(this)

ฉันจะให้เด็กimgใช้เครื่องมือเลือกได้อย่างไร?

คำตอบ:


2854

ตัวสร้าง jQuery ยอมรับพารามิเตอร์ที่ 2 ที่เรียกว่าcontextซึ่งสามารถใช้เพื่อแทนที่บริบทของการเลือก

jQuery("img", this);

ซึ่งเหมือนกับการใช้.find()สิ่งนี้:

jQuery(this).find("img");

หาก imgs ที่คุณต้องการเป็นเพียงผู้สืบทอดโดยตรงขององค์ประกอบที่คลิกคุณสามารถใช้.children():

jQuery(this).children("img");

575
สำหรับสิ่งที่คุ้มค่า: jQuery ("img" สิ่งนี้) จะถูกแปลงภายในเป็น: jQuery (นี่) .find ("img") ดังนั้นวินาทีนี้จึงเร็วขึ้นเล็กน้อย :)
Paul Irish

24
ขอบคุณ @ Paul ผมเป็นห่วงว่าการใช้หา () เป็นที่ไม่ถูกต้องผลัดกันออกมามันเป็นวิธีเดียว;)
Agos

5
หากโหนดเป็นลูกโดยตรงจะไม่เร็วกว่าที่จะทำ $ (นี่) .children ('img'); ?
adamyonk

11
@adamyonk infact ไม่อย่างน้อยไม่ได้หากนี่คือสิ่งที่จะไปโดย: jsperf.com/jquery-children-vs-find/3
Simon Stender Boisen

3
ฉันเห็นตรงข้ามแน่นอนของสิ่งที่ @PaulIrish ที่ระบุไว้ในตัวอย่างนี้ - jsperf.com/jquery-selectors-comparison-a มีใครบ้างไหมที่จะส่องแสงบ้าง? อาจเกิดกรณีทดสอบผิดหรือ jQuery เปลี่ยนการเพิ่มประสิทธิภาพนี้ใน 4 ปีที่ผ่านมา
Jonathan Vanasco

471

คุณสามารถใช้

$(this).find('img');

ซึ่งจะคืนค่าimgs ทั้งหมดที่เป็นลูกหลานของdiv


ในกรณีทั่วไปดูเหมือนว่า$(this).children('img')จะดีกว่า เช่น<div><img src="..." /><div><img src="..." /></div></div>เนื่องจากผู้ใช้ต้องการค้นหา img ระดับที่ 1
Buttle Butkus

137

หากคุณต้องการได้อันดับแรกimgที่ลงหนึ่งระดับคุณสามารถทำได้

$(this).children("img:first")

6
ไม่:firstตรงกับ " ลงหนึ่งระดับเท่านั้น " หรือตรงกับ"อันดับแรก" imgที่พบ
Ian Boyd

3
@IanBoyd .children()เป็นที่มาของ "down one level" และมาจาก:first"first"
Tyler Crompton

3
@IanBoyd องค์ประกอบนั้นจะไม่ถูกนับสำหรับ มันจะใช้เฉพาะถ้าคุณใช้.find()แทน.children()
Tyler Crompton

2
หากคุณกำลังใช้: อันดับแรกด้วย. ค้นหา () ระวัง jQuery ดูเหมือนจะค้นหาลูกหลานทั้งหมดแล้วส่งคืนองค์ประกอบแรกซึ่งบางครั้งมีราคาแพงมาก
คลาเรนซ์หลิว

1
@ButtleButkus ในคำถามthisแล้วมีการอ้างอิงถึงที่<div>มีอยู่<img>แล้ว แต่ถ้าคุณมีหลายระดับของแท็กเพื่อสำรวจจากการอ้างอิงคุณมีแล้วคุณแน่นอนสามารถเขียนมากกว่าหนึ่งchildren()สายแน่นอน
rakslice

76

หากแท็ก DIV ของคุณถูกตามด้วยแท็ก IMG ทันทีคุณสามารถใช้:

$(this).next();

16
. ถัดไป () บอบบางจริงๆเว้นแต่คุณจะสามารถรับประกันได้ว่าองค์ประกอบนั้นจะเป็นองค์ประกอบถัดไปควรใช้วิธีการอื่นที่ดีกว่า ในกรณีนี้ IMG เป็นผู้สืบทอดซึ่งไม่ใช่พี่น้อง
LocalPCGuy

OP ขออย่างชัดเจนสำหรับเด็ก img ภายใน div
Giorgio Tempesta

65

โดยตรงเด็ก

$('> .child-class', this)

3
คำตอบนี้อาจทำให้เข้าใจผิดเนื่องจากไม่มีองค์ประกอบในคลาส 'child' ดังนั้นจึงไม่ทำงาน
Giorgio Tempesta

41

คุณสามารถค้นหาองค์ประกอบ img ทั้งหมดของ div div ตามด้านล่าง

$(this).find('img') or $(this).children('img')

หากคุณต้องการองค์ประกอบ img ที่เฉพาะเจาะจงคุณสามารถเขียนเช่นนี้

$(this).children('img:nth(n)')  
// where n is the child place in parent list start from 0 onwards

div ของคุณมีองค์ประกอบ img หนึ่งรายการเท่านั้น ดังนั้นสำหรับด้านล่างนี้ถูกต้อง

 $(this).find("img").attr("alt")
                  OR
  $(this).children("img").attr("alt")

แต่ถ้า div ของคุณมีองค์ประกอบ img เพิ่มเติมเช่นด้านล่าง

<div class="mydiv">
    <img src="test.png" alt="3">
    <img src="test.png" alt="4">
</div>

จากนั้นคุณไม่สามารถใช้รหัสด้านบนเพื่อค้นหาค่า alt ขององค์ประกอบ img ที่สอง ดังนั้นคุณสามารถลองสิ่งนี้:

 $(this).find("img:last-child").attr("alt")
                   OR
 $(this).children("img:last-child").attr("alt")

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

<div class="mydiv">
    <img class='first' src="test.png" alt="3">
    <img class='second' src="test.png" alt="4">
</div>

คุณสามารถทำได้ดังนี้:

 $(this).find(".first").attr("alt")

และเฉพาะเจาะจงมากขึ้นเป็น:

 $(this).find("img.first").attr("alt")

คุณสามารถใช้การค้นหาหรือเด็ก ๆ เป็นรหัสข้างต้น สำหรับข้อมูลเพิ่มเติมเยี่ยมชมเด็กhttp://api.jquery.com/children/และค้นหาhttp://api.jquery.com/find/ ดูตัวอย่างhttp://jsfiddle.net/lalitjs/Nx8a6/


35

วิธีอ้างอิงเด็กใน jQuery ฉันสรุปใน jQuery ต่อไปนี้:

$(this).find("img"); // any img tag child or grandchild etc...   
$(this).children("img"); //any img tag child that is direct descendant 
$(this).find("img:first") //any img tag first child or first grandchild etc...
$(this).children("img:first") //the first img tag  child that is direct descendant 
$(this).children("img:nth-child(1)") //the img is first direct descendant child
$(this).next(); //the img is first direct descendant child

ฉันจะใช้ลูกคนที่สาม ()
A McGuinness

31

ฉันไม่รู้ว่าคุณสามารถเลือก IMG แบบนี้ได้โดยไม่ทราบ ID ของ DIV

$("#"+$(this).attr("id")+" img:first")

54
นี้อาจใช้งานได้จริง แต่มันเป็นคำตอบที่ดีที่สุดสำหรับ Rube Goldberg :)
38490 Scott

8
และถ้าคุณจะใช้รหัสนั้นอย่างน้อยต้องทำ: $ ("#" + this.id + "img: ครั้งแรก")
LocalPCGuy

10
@LocalPCGuy คุณหมายถึง: "และหากคุณกำลังจะใช้รหัสนั้นเพื่อขอความช่วยเหลือ "
gdoron ให้การสนับสนุน Monica

ทำไมคุณถึงทำเช่นนี้ถ้า 'นี่' เลือก div จริงแล้ว นอกจากนี้หาก div ไม่มีรหัสนี้รหัสจะไม่ทำงาน
Giorgio Tempesta

31

ลองรหัสนี้:

$(this).children()[0]

13
ที่ใช้งานได้แม้ว่าจะส่งคืนองค์ประกอบ dom ไม่ใช่วัตถุ
jq

2
ผมไม่ทราบว่ามันเป็นวิธีที่ดีที่สุดในสถานการณ์ปัจจุบัน แต่ถ้าคุณต้องการที่จะไปเส้นทางนี้และยังคงจบลงด้วยวัตถุ jQuery $($(this).children()[0])เพียงห่อมันด้วยวิธีการที่:
patridge

19
หรือง่ายยิ่งขึ้น$(this:first-child)
rémy

4
แทนการ$($(this).children()[x])ใช้งานหรือถ้าคุณต้องการเป็นคนแรกเพียง$(this).eq(x) $(this).first()
Cristi Mihai

16
@ rémy: นั่นไม่ใช่ไวยากรณ์ที่ถูกต้อง (ใช้เวลาทั้งหมด 2 ปีเพื่อให้ทุกคนสังเกต ... )
BoltClock



15

คุณสามารถใช้Child Selecorเพื่ออ้างอิงอิลิเมนต์ลูกที่มีอยู่ในพาเรนต์

$(' > img', this).attr("src");

และด้านล่างคือถ้าคุณไม่มีการอ้างอิง$(this)และคุณต้องการอ้างอิงที่imgมีอยู่ในdivจากฟังก์ชั่นอื่น ๆ

 $('#divid > img').attr("src");


8

นี่คือรหัสการทำงานที่คุณสามารถเรียกใช้ได้ (เป็นการสาธิตอย่างง่าย)

เมื่อคุณคลิก DIV คุณจะได้ภาพจากวิธีการต่าง ๆ ในสถานการณ์นี้ "นี่" คือ DIV

$(document).ready(function() {
  // When you click the DIV, you take it with "this"
  $('#my_div').click(function() {
    console.info('Initializing the tests..');
    console.log('Method #1: '+$(this).children('img'));
    console.log('Method #2: '+$(this).find('img'));
    // Here, i'm selecting the first ocorrence of <IMG>
    console.log('Method #3: '+$(this).find('img:eq(0)'));
  });
});
.the_div{
  background-color: yellow;
  width: 100%;
  height: 200px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="my_div" class="the_div">
  <img src="...">
</div>

หวังว่ามันจะช่วย!


5

คุณอาจมี 0 ถึง<img>แท็กมากมายภายในของคุณ<div>แท็กภายในของคุณ

ในการค้นหาองค์ประกอบให้ใช้ .find()เพื่อหาองค์ประกอบใช้

.each()เพื่อให้ปลอดภัยรหัสของคุณใช้

การใช้.find()และ.each()ร่วมกันป้องกันข้อผิดพลาดในการอ้างอิง null ในกรณีของ<img>องค์ประกอบ0 ในขณะที่ยังช่วยให้การจัดการหลาย<img>องค์ประกอบ

// Set the click handler on your div
$("body").off("click", "#mydiv").on("click", "#mydiv", function() {

  // Find the image using.find() and .each()
  $(this).find("img").each(function() {
  
        var img = this;  // "this" is, now, scoped to the image element
        
        // Do something with the image
        $(this).animate({
          width: ($(this).width() > 100 ? 100 : $(this).width() + 100) + "px"
        }, 500);
        
  });
  
});
#mydiv {
  text-align: center;
  vertical-align: middle;
  background-color: #000000;
  cursor: pointer;
  padding: 50px;
  
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<div id="mydiv">
  <img src="" width="100" height="100"/>
</div>


ทำไมคุณถึงทำเช่นนี้? $("body").off("click", "#mydiv").on("click", "#mydiv", function() {
Chris22

ฉันไม่รู้ว่า @Alex กำลังใช้ข้อมูลโค้ดของเขาหรือไม่ ดังนั้นฉันทำให้มันปลอดภัยและเป็นไปได้มากที่สุด การแนบเหตุการณ์ไปยังเนื้อหาจะทำให้เหตุการณ์เกิดขึ้นแม้ว่า div ไม่ได้อยู่ใน dom ในเวลาที่กิจกรรมถูกสร้างขึ้น การล้างเหตุการณ์ก่อนสร้างเหตุการณ์ใหม่จะป้องกันไม่ให้ตัวจัดการทำงานมากกว่าหนึ่งครั้งเมื่อมีการเรียกใช้เหตุการณ์ ไม่จำเป็นที่จะต้องทำตามที่ฉันต้องการ เพียงแค่แนบเหตุการณ์กับ div ก็จะได้ผล
Jason Williams

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

4

$(document).ready(function() {
  // When you click the DIV, you take it with "this"
  $('#my_div').click(function() {
    console.info('Initializing the tests..');
    console.log('Method #1: '+$(this).children('img'));
    console.log('Method #2: '+$(this).find('img'));
    // Here, i'm selecting the first ocorrence of <IMG>
    console.log('Method #3: '+$(this).find('img:eq(0)'));
  });
});
.the_div{
  background-color: yellow;
  width: 100%;
  height: 200px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="my_div" class="the_div">
  <img src="...">
</div>


0

คุณสามารถใช้

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
 $(this).find('img');
</script>

สิ่งนี้แตกต่างจากคำตอบของ philnash เมื่อ 11 ปีที่แล้วหรือไม่?
David

0

หาก img ของคุณเป็นองค์ประกอบแรกใน div ให้ลอง

$(this.firstChild);

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