jQuery: How to get to a particular child of a parent?
Asked Answered
W

5

110

To give a simplified example, I've got the following block repeated on the page lots of times (it's dynamically generated):

<div class="box">
   <div class="something1"></div>
   <div class="something2">
      <a class="mylink">My link</a>
   </div>
</div>

When clicked, I can get to the parent of the link with:

$(".mylink").click(function() {
   $(this).parents(".box").fadeOut("fast");
});

However... I need to get to the <div class="something1"> of that particular parent.

Basically, can someone tell me how to refer to a higher-level sibling without being able to refer to it directly? Let's call it big brother. A direct reference to the big brother's class name would cause every instance of that element on the page to fade out - which is not the desired effect.

I've tried:

parents(".box .something1") ... no luck.
parents(".box > .something1") ... no luck.
siblings() ... no luck.

Anyone? Thanks.

Wheelsman answered 8/3, 2010 at 2:22 Comment(7)
Anurag's answer might not seem like the right one -it certainly made me stop and think- but it's pointing out a blatant typo in your code that's causing your selector to fail. The selector, in jQuery, is .parent() not .parents()Elephantine
@ricebowl: Wrong. api.jquery.com/parentsVirgy
@ricebowl... parent() would give me div something2, so I need parents() to get to div box.Wheelsman
Ah; my apologies. Umm...I don't know whether it's best to leave my ignorance on display, or delete the error to avoid upsetting anyone else... =| Still, at least I've learned something useful today; that's the point, right..? =)Elephantine
@ricebowl, no worries, thanks for contributing.Wheelsman
Possible duplicate of How to get the child of an element being dragged with jQuery UIDesuetude
I couldn't have asked this question better.Jeffery
V
164

Calling .parents(".box .something1") will return all parent elements that match the selector .box .something. In other words, it will return parent elements that are .something1 and are inside of .box.

You need to get the children of the closest parent, like this:

$(this).closest('.box').children('.something1')

This code calls .closest to get the innermost parent matching a selector, then calls .children on that parent element to find the uncle you're looking for.

Virgy answered 8/3, 2010 at 2:27 Comment(7)
I know this is a bit old but isn't it better in this case to use parent() rather than closest() as I imagine there is more tree traversal with closest()?Tesch
@acSlater: He needs tree traversal. parent() is the wrong element.Virgy
Ah yes it's parent().parent() that Tom needs sorry! :)Tesch
@acSlater: Yes; that would work. However, it makes the Javascript much more coupled to the HTML structure. .closest(...) is more resilient, and more readable too.Virgy
I was just saying I realised he needed parent->parent, I agree with you closest is best for this scenarioTesch
In case anyone is wondering: after you've found the right parent using .closest(), if you're looking for a child element that is NOT a direct child (but a child of a child, for example), just use .find() in place of .children.Connel
For my code I needed $(this).closest('.box').prev('.something1') but this answer helped me figure that outJeffery
C
21
$(this).parent()

Tree traversal is fun

$(this).parent().siblings(".something1");

$(this).parent().prev(); // if you always want the parent's previous sibling

$(this).parents(".box").children(".something1");

And much more ways, you might find these docs helpful.

Comeon answered 8/3, 2010 at 2:27 Comment(2)
Thanks but wasn't looking for the parent, but rather another child of parent (or grandparent actually).Wheelsman
Hehe... its a family affair indeed.Wheelsman
W
17

This will find the first parent with class box then find the first child class with regex matching something and get the id.

$(".mylink").closest(".box").find('[class*="something"]').first().attr("id")
Waterrepellent answered 6/8, 2013 at 3:4 Comment(0)
L
7

If I understood your problem correctly, $(this).parents('.box').children('.something1') Is this what you are looking for?

Little answered 8/3, 2010 at 2:33 Comment(0)
F
5

You could use .each() with .children() and a selector within the parenthesis:

//Grab Each Instance of Box.
$(".box").each(function(i){

    //For Each Instance, grab a child called .something1. Fade It Out.
    $(this).children(".something1").fadeOut();
});
Furculum answered 25/3, 2013 at 22:10 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.