111

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.

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() Commented Mar 8, 2010 at 2:29
  • @ricebowl: Wrong. api.jquery.com/parents Commented Mar 8, 2010 at 2:30
  • @ricebowl... parent() would give me div something2, so I need parents() to get to div box. Commented Mar 8, 2010 at 2:31
  • 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..? =) Commented Mar 8, 2010 at 2:36
  • 1
    @ricebowl, no worries, thanks for contributing. Commented Mar 8, 2010 at 2:37

5 Answers 5

165

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.

Sign up to request clarification or add additional context in comments.

7 Comments

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()?
@acSlater: He needs tree traversal. parent() is the wrong element.
Ah yes it's parent().parent() that Tom needs sorry! :)
@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.
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.
|
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.

2 Comments

Thanks but wasn't looking for the parent, but rather another child of parent (or grandparent actually).
Hehe... its a family affair indeed.
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") 

Comments

7

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

Comments

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(); }); 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.