$ (Bu) seçicinin çocukları nasıl edinilir?


2229

Buna benzer bir düzen var:

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

ve tıklamanın imgiçindeki çocuğu seçmek için bir jQuery seçici kullanmak istersiniz div.

Almak için, divbu seçici var:

$(this)

Çocuğu imgseçici kullanarak nasıl edinebilirim ?

Yanıtlar:


2854

JQuery yapıcısı context, seçim bağlamını geçersiz kılmak için kullanılabilen adlandırılan 2. parametreyi kabul eder .

jQuery("img", this);

Bu, şu şekilde kullanmakla aynıdır .find():

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

İstediğiniz imgs yalnızca tıklanan öğenin doğrudan torunlarıysa, şunları da kullanabilirsiniz .children():

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

575
değer için: jQuery ("img", bu) dahili olarak dönüştürülür: jQuery (this) .find ("img") Yani ikincisi biraz daha hızlıdır. :)
Paul Irish

24
Teşekkürler @Paul, find () kullanmanın yanlış olduğu, tek yol olduğu ortaya çıktı;)
Agos

5
Düğüm doğrudan bir çocuksa, sadece $ (this) .children ('img') yapmak en hızlı olmaz mıydı? ?
adamyonk

11
@adamyonk infact değil, en azından bu gitmek için bir şey varsa değil: jsperf.com/jquery-children-vs-find/3
Simon Stender Boisen

3
@PaulIrish bu örnekte belirtilenlerin tam tersini görüyorum - jsperf.com/jquery-selectors-comparison-a . Biraz ışık tutabilecek olan var mı? Ya test davasını yanlış anladım ya da jquery bu optimizasyonu son 4 yılda değiştirdi.
Jonathan Vanasco

471

Ayrıca kullanabilirsiniz

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

... ve imgonların torunları olandiv


Genel durumlarda, $(this).children('img')daha iyi gibi görünüyor . Örneğin, <div><img src="..." /><div><img src="..." /></div></div>muhtemelen kullanıcı 1. düzey imgs bulmak istiyor.
Buttle Butkus

137

İlk almak gerekiyorsa imgaşağı olduğunu tam olarak bir seviye, yapabileceğiniz

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

6
Does :firstsadece "maç aşağı tam bir seviye ", ya da maç yok "ilk" bulunmuştur ki? img
Ian Boyd

3
@IanBoyd, .children()"tam olarak bir seviye aşağı" :firstnın geldiği ve "ilk" in geldiği yerdir.
Tyler Crompton

3
@IanBoyd, bu öğeye açıklanamaz. Sadece .find()yerine kullanırsanız geçerlidir.children()
Tyler Crompton

2
kullanıyorsanız: önce bir .find () ile dikkatli olun, jQuery tüm torunları buluyor ve sonra bazen çok pahalı olan ilk elementi geri veriyor gibi görünüyor
Clarence Liu

1
@ButtleButkus Soruda this, zaten <div>içeren içeren bir referans <img>, ancak sahip olduğunuz referanstan geçmek için birden fazla etiket seviyeniz varsa, kesinlikle kesinlikle birden fazla children()çağrı oluşturabilirsiniz
rakslice

76

DIV etiketinizi hemen IMG etiketi izliyorsa, aşağıdakileri de kullanabilirsiniz:

$(this).next();

16
.next () gerçekten kırılgandır, öğenin bir sonraki öğe olacağını her zaman garanti edemezseniz, farklı bir yöntem kullanmak daha iyidir. Bu durumda, IMG div'ın bir torunu değil, soyundan geliyor.
LocalPCGuy

OP açıkça div içinde bir çocuk img istedi.
Giorgio Tempesta

65

Direkt çocuktur

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

3
Bu cevap potansiyel olarak yanıltıcıdır çünkü 'çocuk' sınıfına sahip bir unsur olmadığından işe yaramaz.
Giorgio Tempesta

41

Aşağıda ana div öğesinin tüm img öğelerini bulabilirsiniz

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

Belirli bir img öğesi istiyorsanız bu şekilde yazabilirsiniz

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

Div'iniz yalnızca bir img öğesi içeriyor. Bunun için aşağıda doğru

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

Ancak div'iniz aşağıdaki gibi daha fazla img öğesi içeriyorsa

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

ikinci img öğesinin alt değerini bulmak için üst kodu kullanamazsınız. Böylece şunu deneyebilirsiniz:

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

Bu örnek, ana nesne içinde gerçek nesneyi nasıl bulabileceğinize dair genel bir fikri gösterir. Alt nesnenizi farklılaştırmak için sınıfları kullanabilirsiniz. Bu kolay ve eğlenceli. yani

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

Bunu aşağıdaki gibi yapabilirsiniz:

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

ve daha spesifik olarak:

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

Yukarıdaki kodda olduğu gibi find veya children kullanabilirsiniz. Daha fazla bilgi için Çocuklar http://api.jquery.com/children/ adresini ziyaret edin ve http://api.jquery.com/find/ adresini bulun . Örneğe bakın http://jsfiddle.net/lalitjs/Nx8a6/


35

JQuery'de bir çocuğa gönderme yolları. Aşağıdaki jQuery özetledi:

$(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

Nth-child ()
A McGuinness

31

DIV kimliğini bilmeden IMG'yi şöyle seçebilirsiniz:

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

54
bu muhtemelen gerçekten işe yarıyor ama biraz Rube Goldberg cevabı :)
Scott Evernden

8
ve bu kodu kullanacaksanız, en azından şunu yapın: $ ("#" + this.id + "img: ilk")
LocalPCGuy

10
@LocalPCGuy Yani: "ve bu kod çağrısını yardım için kullanacaksanız "
gdoron Monica

'This' zaten gerçek div'i seçtiyse neden bunu yapasın ki? Ayrıca, div'in bir kimliği yoksa bu kod çalışmaz.
Giorgio Tempesta

31

Bu kodu deneyin:

$(this).children()[0]

13
jq nesnesi değil bir dom öğesi döndürmesine rağmen işe yarayacaktır
redsquare

2
Ben mevcut duruma en iyi yaklaşım olup olmadığını biliyorum, ama, bu yol gitmek ve hala jQuery nesnesi ile bitirmek istiyorum sadece bu şekilde sarın yoktur: $($(this).children()[0]).
patridge

19
hatta daha da kolay$(this:first-child)
rémy

4
onun yerine $($(this).children()[x])kullanmak$(this).eq(x) ya da birincisini istiyorsanız, sadece $(this).first().
Cristi Mihai

16
@ rémy: Bu geçerli bir sözdizimi bile değil. (Herkesin fark etmesi için 2 yıl sürdü ...)
sürdü

23

Aşağıdaki yöntemlerden birini kullanabilirsiniz:

1 bul ():

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

2 çocuk ():

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

21

jQuery's eachbir seçenektir:

<div id="test">
    <img src="testing.png"/>
    <img src="testing1.png"/>
</div>

$('#test img').each(function(){
    console.log($(this).attr('src'));
});

15

Üst Selecor'u , üst öğede bulunan alt öğelere başvurmak için kullanabilirsiniz .

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

Ve aşağıda $(this)referansınız imgyoksa divve başka bir fonksiyonda bulunan referansı almak istiyorsanız .

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


8

İşte fonksiyonel bir kod, çalıştırabilirsiniz (basit bir gösteri).

DIV'yi tıkladığınızda görüntüyü bazı farklı yöntemlerden alırsınız, bu durumda "bu" DIV'dir.

$(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>

Umarım yardımcı olur!


5

İçinde 0 ila birçok <img>etiket olabilir <div>.

Bir öğe bulmak için a .find().

Kodunuzu güvende tutmak için a .each().

Birlikte .find()ve .each()birlikte kullanılması , 0 <img>eleman durumunda boş referans hatalarını önlerken birden fazla <img>elemanın kullanılmasına izin verir .

// 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>


bunu neden yaptın? $("body").off("click", "#mydiv").on("click", "#mydiv", function() {
Chris22

@Alex'in snippet'ini nasıl veya nerede kullandığını bilmiyorum. Bu yüzden mümkün olduğunca güvenli ve genel yaptım. Bir olayı gövdeye eklemek, etkinliğin oluşturulduğu sırada div dom olmasa bile etkinliğin tetiklenmesini sağlar. Yeni bir tane oluşturmadan önce olayı temizlemek, bir olay tetiklendiğinde işleyicinin birden fazla çalışmasını önler. Bunu kendi tarzımda yapmak gerekli değil. Olayı div'e eklemek de işe yarayacaktır.
Jason Williams

Teşekkürler. Bunu daha önce bir senaryoda gördüm ve programcının amaçladığı şey için çalışırken, modal bir pencere için kullanmaya çalıştığımda, olay hala tek tıklamayla birkaç modal oluşturdu. Sanırım yanlış kullanıyordum, ama bunun event.stopImmediatePropagation()olmasını önlemek için elemanı kullanarak yaralandım .
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

Kullanabilirsin

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

Bunun philnash'ın 11 yıl önceki cevabından farkı nedir?
David

0

İmg'niz div içindeki ilk öğe ise, o zaman deneyin

$(this.firstChild);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.