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?

Alex
quelle

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");
Simon
quelle
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

Philnash
quelle
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")
Rakslice
quelle
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();
Roccivic
quelle
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)
Rayron Victor
quelle
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/

Lalit Kumar Maurya
quelle
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
Oskar
quelle
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")
Adam
quelle
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]
Maxam
quelle
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');
Mike Clark
quelle
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'));
});
Thirumalai Murugan
quelle
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");
Dennis R.
quelle
12

Auch das sollte funktionieren:

$("#id img")
Tetutato
quelle
2
die this
Operation
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!

RPichioli
quelle
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>

Jason Williams
quelle
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>

CSEngineer
quelle
0

Du könntest benutzen

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

Kamil Kiełczewski
quelle