Wie bekomme ich die Kinder des $ (this) Selektors?


2229

Ich habe ein ähnliches Layout:

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

und möchte einen jQuery-Selektor verwenden, um das untergeordnete Element imginnerhalb des divOn-Klicks auszuwählen .

Um das zu bekommen div, habe ich diesen Selektor:

$(this)

Wie kann ich das Kind imgmit einem Selektor dazu bringen?

Antworten:


2854

Der jQuery-Konstruktor akzeptiert einen zweiten aufgerufenen Parameter, mit contextdem der Kontext der Auswahl überschrieben werden kann.

jQuery("img", this);

Welches ist das gleiche wie die Verwendung .find()wie folgt :

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

Wenn die gewünschten Bilder nur direkte Nachkommen des angeklickten Elements sind, können Sie auch Folgendes verwenden .children():

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

575
für das, was es wert ist: jQuery ("img", this) wird intern konvertiert in: jQuery (this) .find ("img") Die zweite ist also etwas schneller. :)
Paul Irish

24
Danke @Paul, ich war besorgt, dass die Verwendung von find () falsch war , es stellte sich heraus, dass dies der einzige Weg ist;)
Agos

5
Wenn der Knoten ein direktes untergeordnetes Element ist, wäre es nicht am schnellsten, nur $ (this) .children ('img') auszuführen. ?
Adamyonk

11
@adamyonk infact nicht, zumindest nicht, wenn dies etwas zu gehen ist: jsperf.com/jquery-children-vs-find/3
Simon Stender Boisen

3
Ich sehe das genaue Gegenteil von dem, was @PaulIrish in diesem Beispiel angegeben hat - jsperf.com/jquery-selectors-comparison-a . Kann jemand etwas Licht ins Dunkel bringen? Entweder habe ich den Testfall falsch verstanden oder jquery hat diese Optimierung in den letzten 4 Jahren geändert.
Jonathan Vanasco

471

Sie könnten auch verwenden

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

das würde alle imgs zurückgeben, die Nachkommen der sinddiv


Im Allgemeinen scheint $(this).children('img')es besser zu sein. zB <div><img src="..." /><div><img src="..." /></div></div>weil vermutlich der Benutzer Bilder der ersten Ebene finden möchte.
Buttle Butkus

137

Wenn Sie die erste benötigen, die imggenau eine Ebene tiefer liegt, können Sie dies tun

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

6
Entspricht :firstnur " genau eine Ebene tiefer " oder stimmt es mit dem "ersten" img überein, das gefunden wurde?
Ian Boyd

3
@ IanBoyd, .children()woher kommt das "Down genau eine Ebene" und :firstwoher das "Erste" kommt.
Tyler Crompton

3
@ IanBoyd, dieses Element würde nicht berücksichtigt. Es würde nur gelten, wenn Sie .find()anstelle von.children()
Tyler Crompton

2
Wenn Sie verwenden: zuerst mit einer .find () vorsichtig sein, scheint jQuery alle Nachkommen zu finden und dann das erste Element zurückzugeben, manchmal sehr teuer
Clarence Liu

1
@ ButtleButkus In der Frage thiswar bereits ein Verweis auf das Enthalten <div>des <img>, aber wenn Sie mehrere Ebenen von Tag haben, um von der Referenz zu durchqueren, die Sie hatten, dann könnten Sie definitiv mehr als einen children()Anruf
verfassen

76

Wenn auf Ihr DIV-Tag unmittelbar das IMG-Tag folgt, können Sie auch Folgendes verwenden:

$(this).next();

16
.next () ist sehr fragil. Wenn Sie nicht immer garantieren können, dass das Element das nächste Element ist, ist es besser, eine andere Methode zu verwenden. In diesem Fall ist der IMG ein Nachkomme und kein Geschwister des Div.
LocalPCGuy

Das OP bat ausdrücklich um ein Kind img innerhalb der div.
Giorgio Tempesta

65

Die direkten Kinder sind

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

3
Diese Antwort ist möglicherweise irreführend, da es kein Element mit einer 'Kind'-Klasse gibt, sodass es nicht funktioniert.
Giorgio Tempesta

41

Sie finden alle img-Elemente des übergeordneten div wie unten

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

Wenn Sie ein bestimmtes img-Element möchten, können Sie so schreiben

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

Ihr div enthält nur ein img-Element. Also dafür ist unten richtig

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

Aber wenn dein div mehr img element enthält wie unten

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

dann können Sie keinen oberen Code verwenden, um den Alt-Wert des zweiten img-Elements zu finden. Sie können dies also versuchen:

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

Dieses Beispiel zeigt eine allgemeine Vorstellung davon, wie Sie das tatsächliche Objekt im übergeordneten Objekt finden können. Sie können Klassen verwenden, um Ihr untergeordnetes Objekt zu unterscheiden. Das ist einfach und macht Spaß. dh

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

Sie können dies wie folgt tun:

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

und genauer als:

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

Sie können find oder Kinder wie oben beschrieben verwenden. Weitere Informationen finden Sie unter Kinder unter http://api.jquery.com/children/ und unter http://api.jquery.com/find/ . Siehe Beispiel http://jsfiddle.net/lalitjs/Nx8a6/


35

Möglichkeiten, auf ein Kind in jQuery zu verweisen. Ich habe es in der folgenden jQuery zusammengefasst:

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

Ich würde das n-te Kind ()
A McGuinness

31

Ohne die ID des DIV zu kennen, könnten Sie den IMG wie folgt auswählen:

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

54
Das funktioniert wahrscheinlich tatsächlich, aber es ist irgendwie die Antwort von Rube Goldberg :)
Scott Evernden

8
und wenn Sie diesen Code verwenden wollen, tun Sie mindestens: $ ("#" + this.id + "img: first")
LocalPCGuy

10
@LocalPCGuy Sie meinten: "Und wenn Sie diesen Code verwenden wollen, rufen Sie um Hilfe "
Gdoron unterstützt Monica

Warum würden Sie dies tun, wenn 'dies' bereits den tatsächlichen div auswählt? Außerdem funktioniert dieser Code nicht, wenn der div keine ID hat.
Giorgio Tempesta

31

Versuchen Sie diesen Code:

$(this).children()[0]

13
das würde funktionieren, obwohl es ein dom-Element zurückgibt, kein jq-Objekt
redsquare

2
Ich weiß nicht, ob dies der beste Ansatz für die aktuelle Situation ist, aber wenn Sie diesen Weg gehen und dennoch ein jQuery-Objekt erhalten möchten, wickeln Sie es einfach so ein : $($(this).children()[0]).
Patridge

19
oder noch einfacher$(this:first-child)
rémy

4
statt zu $($(this).children()[x])benutzen $(this).eq(x)oder wenn du den ersten willst, einfach $(this).first().
Cristi Mihai

16
@ rémy: Das ist nicht einmal eine gültige Syntax. (Es
dauerte

23

Sie können eine der folgenden Methoden verwenden:

1 find ():

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

2 Kinder():

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

21

jQuery's eachist eine Option:

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

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

15

Mit Child Selecor können Sie auf die untergeordneten Elemente verweisen, die im übergeordneten Element verfügbar sind.

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

Und das Folgende ist, wenn Sie keinen Verweis auf haben $(this)und einen Verweis imginnerhalb einer divanderen Funktion verfügbar machen möchten .

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


8

Hier ist ein Funktionscode, den Sie ausführen können (es ist eine einfache Demonstration).

Wenn Sie auf den DIV klicken, erhalten Sie das Bild von verschiedenen Methoden. In dieser Situation ist "dies" der 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>

Ich hoffe es hilft!


5

Sie können 0 bis viele <img>Tags in Ihrem haben <div>.

Verwenden Sie a, um ein Element zu finden .find().

Verwenden Sie a, um Ihren Code zu schützen .each().

Die Verwendung von .find()und .each()zusammen verhindert Nullreferenzfehler bei 0 <img>Elementen und ermöglicht gleichzeitig die Behandlung mehrerer <img>Elemente.

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


Warum hast du das getan? $("body").off("click", "#mydiv").on("click", "#mydiv", function() {
Chris22

Ich weiß nicht, wie oder wo @Alex sein Snippet verwendet. Also habe ich es so sicher und allgemein wie möglich gemacht. Durch das Anhängen eines Ereignisses an den Body wird das Ereignis so ausgelöst, dass es ausgelöst wird, auch wenn sich das div zum Zeitpunkt der Erstellung des Ereignisses nicht im Dom befand. Durch das Löschen des Ereignisses vor dem Erstellen eines neuen Ereignisses wird verhindert, dass der Handler mehr als einmal ausgeführt wird, wenn ein Ereignis ausgelöst wird. Es ist nicht notwendig, es auf meine Weise zu tun. Das Anhängen des Ereignisses an das div würde ebenfalls funktionieren.
Jason Williams

Vielen Dank. Ich habe dies bereits in einem Skript gesehen und während es für das funktionierte, was der Programmierer beabsichtigte, hat das Ereignis beim Versuch, es für ein modales Fenster zu verwenden, immer noch mehrere Modalitäten mit einem Klick erstellt. Ich glaube, ich habe es falsch verwendet, aber ich habe event.stopImmediatePropagation()das Element verwendet, um dies zu verhindern.
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

Du könntest benutzen

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

Wie unterscheidet sich das von Philnashs Antwort vor 11 Jahren?
David

0

Wenn Ihr img genau das erste Element in div ist, versuchen Sie es

$(this.firstChild);

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.