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?

Alex
źródło

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");
Szymon
źródło
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

philnash
źródło
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")
Rakslice
źródło
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();
Roccivic
źródło
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)
Rayron Victor
źródło
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/

Lalit Kumar Maurya
źródło
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
Oskar
źródło
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")
Adam
źródło
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]
Maxam
źródło
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');
Mike Clark
źródło
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'));
});
Thirumalai murugan
źródło
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");
Dennis R
źródło
12

Powinno to również działać:

$("#id img")
tetutato
źródło
2
op chciał użyćthis
Bhargav Nanekalva
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!

RPichioli
źródło
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>

Jason Williams
źródło
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>

CSEngineer
źródło
0

Możesz użyć

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
 $(this).find('img');
</script>
Hassan Fayyaz
źródło
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);

Kamil Kiełczewski
źródło