tags:

views:

50

answers:

3

Hi, I'm in a situation in which I need to use .wrap and :first-child.

This is what I am doing:

<script>$("a").wrap("<div class='category-wrapper'></div>");</script>
<script>$("div.category-wrapper:first-child").addClass("first");</script> 

This should render a div.category-wrapper outside a link and then add a "first" class to every first div.category-wrapper.

The output is:

<div class="category-wrapper"><a href="#">Test</a></div>

Which is good! However, I am not able to get the "first-child" to work (it doesn't adds the "first" class). If I use it somewhere else it works so I am sure it's something related to the dynamic rendering of the previous element.

Any help is appreciated!

Thanks!

Sample output would be:

<div class="category-wrapper"><a href="#">Test #1</a></div>
<div class="category-wrapper"><a href="#">Test #2</a></div>
<div class="category-wrapper"><a href="#">Test #3</a></div>
<div class="category-wrapper"><a href="#">Test #4</a></div>

Desired output:

<div class="category-wrapper first"><a href="#">Test #1</a></div>
<div class="category-wrapper"><a href="#">Test #2</a></div>
<div class="category-wrapper"><a href="#">Test #3</a></div>
<div class="category-wrapper"><a href="#">Test #4</a></div>

However, I am not able to make it work.

+2  A: 

Have you tried $("div.category-wrapper a:first-child") ?

mtwallet
He wants the class to be added to the `<div>`, not the `<a>`.
Pointy
Sorry, long day didn't read that correctly
mtwallet
I've edited the question so you can check the desired output.
Johann
I have just tried your code and it works fine I have uploaded an example at www.nicklansdell.com/stack/ look at it with firebug
mtwallet
Thanks a lot for your sample code. However, I didn't took in considerating there were surrounding elements that were affecting this. Your code helped me anyways as a sample to organize mine since I was loading several scripts at the same time instead of just one with all the code in it!
Johann
+1  A: 

If you have something like this:

<div>
  Hello there
  <span>Somethiing something</span>
  <a href='somewhere'>wrap me</a>

Then when that <a> tag is wrapped you'll have this:

<div>
  Hello there
  <span>Somethiing something</span>
  <div class='category-wrapper'><a href='somewhere'>wrap me</a></div>

That added <div> is not the first child of the containing <div>.

It might work for you to use ":first" instead of ":first-child". Those two are of course not always interchangeable.

Pointy
Thanks for the sample code @Pointy. This works to understand the "big picture" of this issue!
Johann
+4  A: 

first-child depends on the context of the element you're trying to select: "Description: Selects all elements that are the first child of their parent.".

Check this out:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
<html xmlns="http://www.w3.org/1999/xhtml"&gt;
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>First Child Exp</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"&gt;&lt;/script&gt;

<style type="text/css">
.first { background-color: red; }
</style>

</head>

<body>

<h1>First Child Exp</h1>

<div>
<div class="category-wrapper"><a href="#">Test</a></div>
</div>

<script type="text/javascript">
$("div.category-wrapper:first-child").addClass("first");
</script>

</body>
</html>

If you delete the div with no class, then div class="category-wrapper" will be the second child of it's parent, since the h1 will be the first child of body. If you then delete the h1, div class="category-wrapper" will again be the first child of body.

So, a parent element must surround all of the div class="category-wrapper" elements.

KatieK
Correct, @KatieK!
Pointy
Awesome @KatieK . I was struggling with this but this is the best example and explanation for sure! Thanks!
Johann