Jak zdobyć dzieci selektora $ (this)?


2229

Mam układ podobny do tego:

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

i chciałby użyć selektora jQuery, aby wybrać dziecko imgwewnątrz divkliknięcia.

Aby uzyskać div, mam ten selektor:

$(this)

Jak mogę uzyskać dziecko imgza pomocą selektora?

Odpowiedzi:


2854

Konstruktor jQuery akceptuje drugi parametr o nazwie, contextktóry można wykorzystać do przesłonięcia kontekstu wyboru.

jQuery("img", this);

To jest to samo, co przy użyciu .find()takiego:

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

Jeśli pożądane obrazy są tylko bezpośrednimi potomkami klikniętego elementu, możesz również użyć .children():

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

575
za to, co jest warte: jQuery („img”, this) jest wewnętrznie konwertowany na: jQuery (this) .find („img”) Tak więc druga jest zawsze nieco szybsza. :)
Paul Irish

24
Dzięki @Paul, martwiłem się, że użycie find () było złe , okazało się, że to jedyny sposób;)
Agos

5
Jeśli węzeł jest bezpośrednim dzieckiem, czy nie byłoby najszybciej zrobić $ (this) .children ('img'); ?
adamyonk

11
@adamyonk w rzeczywistości nie, przynajmniej nie, jeśli jest to coś do zrobienia: jsperf.com/jquery-children-vs-find/3
Simon Stender Boisen

3
Widzę dokładne przeciwieństwo tego, co @PaulIrish stwierdził w tym przykładzie - jsperf.com/jquery-selectors-comparison-a . Czy ktoś może rzucić nieco światła? Albo źle zrozumiałem przypadek testowy, albo jquery zmieniło tę optymalizację w ciągu ostatnich 4 lat.
Jonathan Vanasco

471

Możesz także użyć

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

które zwrócą wszystkie imgpotomkidiv


W ogólnych przypadkach wydaje się, że $(this).children('img')byłoby lepiej. np. <div><img src="..." /><div><img src="..." /></div></div>ponieważ prawdopodobnie użytkownik chce znaleźć obrazy pierwszego poziomu.
Buttle Butkus

137

Jeśli potrzebujesz pierwszego, imgktóry spadł dokładnie o jeden poziom, możesz to zrobić

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

6
Czy :firstpasuje tylko „ dokładnie o jeden poziom ”, czy też pasuje do „pierwszego”, img który został znaleziony?
Ian Boyd

3
@IanBoyd, .children() skąd pochodzi „dokładnie jeden poziom” i stąd :first„pierwszy”.
Tyler Crompton,

3
@IanBoyd, ten element nie zostałby uwzględniony. Miałoby to zastosowanie tylko w przypadku użycia .find()zamiast.children()
Tyler Crompton

2
jeśli używasz: najpierw z .find () bądź ostrożny, jQuery wydaje się znajdować wszystkich potomków, a następnie zwraca pierwszy element, czasami bardzo drogi
Clarence Liu

1
@ButtleButkus W pytaniu thisbyło już odniesienie do <div>zawierającego <img>, jednak jeśli masz wiele poziomów znacznika do przejścia od referencji, którą na pewno posiadasz, to zdecydowanie możesz skomponować więcej niż jedno children()wywołanie
rakslice

76

Jeśli zaraz po tagu DIV następuje tag IMG, możesz także użyć:

$(this).next();

16
.next () jest naprawdę delikatny, chyba że zawsze możesz zagwarantować, że element będzie następnym elementem, lepiej użyć innej metody. W tym przypadku IMG jest potomkiem, a nie rodzeństwem div.
LocalPCGuy

OP wyraźnie poprosił o dziecko img wewnątrz div.
Giorgio Tempesta,

65

Te bezpośrednie dzieci jest

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

3
Ta odpowiedź jest potencjalnie myląca, ponieważ nie ma elementu z klasą „podrzędną”, więc nie zadziała.
Giorgio Tempesta

41

Możesz znaleźć wszystkie elementy img rodzica div jak poniżej

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

Jeśli chcesz konkretnego elementu img, możesz napisać w ten sposób

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

Twoja div zawiera tylko jeden element img. Więc do tego poniżej jest właściwe

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

Ale jeśli twoja div zawiera więcej elementów img jak poniżej

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

wtedy nie można użyć górnego kodu, aby znaleźć wartość alt drugiego elementu img. Możesz więc spróbować:

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

Ten przykład pokazuje ogólną ideę, jak znaleźć rzeczywisty obiekt w obiekcie nadrzędnym. Za pomocą klas można rozróżnić obiekt podrzędny. To łatwe i przyjemne. to znaczy

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

Możesz to zrobić jak poniżej:

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

i bardziej szczegółowe, jak:

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

Możesz użyć find lub child jak powyżej. Więcej informacji można znaleźć na stronie Dzieci http://api.jquery.com/children/ i Znajdź http://api.jquery.com/find/ . Zobacz przykład http://jsfiddle.net/lalitjs/Nx8a6/


35

Sposoby odwoływania się do dziecka w jQuery. Podsumowałem to w następującym 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

Użyłbym n-child ()
A McGuinness

31

Nie znając identyfikatora DIV, myślę, że możesz wybrać IMG w następujący sposób:

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

54
to prawdopodobnie działa, ale to odpowiedź Rube Goldberga :)
Scott Evernden,

8
a jeśli zamierzasz użyć tego kodu, wykonaj przynajmniej: $ („#” + this.id + „img: first”)
LocalPCGuy

10
@LocalPCGuy Miałeś na myśli: „a jeśli zamierzasz użyć tego wezwania do pomocy
gdoron obsługuje Monikę

Dlaczego miałbyś to zrobić, jeśli „to” już wybiera rzeczywisty div? Poza tym, jeśli div nie ma identyfikatora, ten kod nie będzie działał.
Giorgio Tempesta

31

Wypróbuj ten kod:

$(this).children()[0]

13
że będzie działać chociaż zwraca element DOM nie obiekt JQ
redsquare

2
Nie wiem, czy jest to najlepsze podejście do obecnej sytuacji, ale jeśli chcesz pójść tą drogą i nadal skończyć z obiektu jQuery, po prostu zawinąć go w ten sposób: $($(this).children()[0]).
patridge

19
lub nawet łatwiej$(this:first-child)
rem

4
zamiast $($(this).children()[x])używać $(this).eq(x)lub jeśli chcesz pierwszy, po prostu $(this).first().
Cristi Mihai

16
@ rémy: To nawet nie jest poprawna składnia. (Zajęło to wszystkie 2 lata, aby ktokolwiek to zauważył ...)
BoltClock

23

Możesz użyć jednej z następujących metod:

1 znaleźć ():

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

2 dzieci():

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

21

jQuery's eachjest jedną z opcji:

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

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

15

Za pomocą Selecor podrzędny można odwoływać się do elementów podrzędnych dostępnych w ramach elementu nadrzędnego.

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

A poniżej jest, jeśli nie masz odniesienia do $(this)i chcesz odwoływać się imgw ramach divinnej funkcji.

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


8

Oto funkcjonalny kod, możesz go uruchomić (to prosta demonstracja).

Kiedy klikniesz DIV, otrzymasz obraz z kilku różnych metod, w tej sytuacji „to” jest 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>

Mam nadzieję, że to pomoże!


5

Możesz mieć od 0 do wielu <img>tagów w swoim<div> .

Aby znaleźć element, użyj .find() .

Aby zabezpieczyć kod, użyj .each().

Użycie .find()i .each()razem zapobiega błędom odniesienia zerowym w przypadku 0 <img>elementów, jednocześnie umożliwiając obsługę wielu <img>elementów.

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


dlaczego to robisz? $("body").off("click", "#mydiv").on("click", "#mydiv", function() {
Chris22

Nie wiem, jak i gdzie @Alex używa swojego fragmentu kodu. Zrobiłem to tak bezpieczne i ogólne, jak to możliwe. Dołączenie zdarzenia do ciała sprawi, że będzie ono wyzwalane, nawet jeśli div nie będzie w domie w momencie utworzenia zdarzenia. Wyczyszczenie zdarzenia przed utworzeniem nowego zapobiega uruchomieniu programu obsługi więcej niż jeden raz, gdy zdarzenie zostanie wyzwolone. Nie trzeba tego robić po swojemu. Po prostu dołączenie wydarzenia do div również działałoby.
Jason Williams

Dzięki. Widziałem to wcześniej w skrypcie i chociaż działało to zgodnie z zamierzeniami programisty, kiedy próbowałem użyć go w oknie modalnym, wydarzenie nadal tworzyło kilka modaliów za jednym kliknięciem. Wydaje mi się, że źle go użyłem, ale skończyło się event.stopImmediatePropagation()na tym elemencie, aby temu zapobiec.
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

Możesz użyć

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

Czym różni się to od odpowiedzi philnash 11 lat temu?
David

0

Jeśli twój obraz jest dokładnie pierwszym elementem w div, spróbuj

$(this.firstChild);

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.