# DOM Traversing

# Select children of element

To select the children of an element you can use the children() (opens new window) method.

<div class="parent">
    <h2>A headline</h2>
    <p>Lorem ipsum dolor sit amet...</p>
    <p>Praesent quis dolor turpis...</p>
</div>

Change the color of all the children of the .parent element:

$('.parent').children().css("color", "green");

The method accepts an optional selector argument that can be used to filter the elements that are returned.

// Only get "p" children
$('.parent').children("p").css("color", "green");

# Iterating over list of jQuery elements

When you need to iterate over the list of jQuery elements.

Consider this DOM structure:

<div class="container">
    <div class="red one">RED 1 Info</div>
    <div class="red two">RED 2 Info</div>
    <div class="red three">RED 3 Info</div>
</div>

To print the text present in all the div elements with a class of red:

$(".red").each(function(key, ele){
    var text = $(ele).text();
    console.log(text);
});

Tip: key is the index of the div.red element we're currently iterating over, within its parent. ele is the HTML element, so we can create a jQuery object from it using $() or jQuery(), like so: $(ele). After, we can call any jQuery method on the object, like css() or hide() etc. In this example, we just pull the text of the object.

# Selecting siblings

To select siblings of an item you can use the .siblings() (opens new window) method.

A typical example where you want to modify the siblings of an item is in a menu:

<ul class="menu">
    <li class="selected">Home</li>
    <li>Blog</li>
    <li>About</li>
</ul>

When the user clicks on a menu item the selected class should be added to the clicked element and removed from its siblings:

$(".menu").on("click", "li", function () {
    $(this).addClass("selected");
    $(this).siblings().removeClass("selected");
});

The method takes an optional selector argument, which can be used if you need to narrow down the kinds of siblings you want to select:

$(this).siblings("li").removeClass("selected");

# closest() method

Returns the first element that matches the selector starting at the element and traversing up the DOM tree.

HTML

<div id="abc" class="row">
    <div id="xyz" class="row">
    </div>
    <p id="origin">
      Hello
    </p>
</div>

jQuery

var target = $('#origin').closest('.row');
console.log("Closest row:", target.attr('id') );

var target2 = $('#origin').closest('p');
console.log("Closest p:", target2.attr('id') );

OUTPUT

"Closest row: abc"
"Closest p: origin"

first() method : The first method returns the first element from the matched set of elements.

HTML

<div class='.firstExample'>
   <p>This is first paragraph in a div.</p>
   <p>This is second paragraph in a div.</p>
   <p>This is third paragraph in a div.</p>
   <p>This is fourth paragraph in a div.</p>
   <p>This is fifth paragraph in a div.</p>
</div>

JQuery

var firstParagraph = $("div p").first();
console.log("First paragraph:", firstParagraph.text());

Output:

First paragraph: This is first paragraph in a div.

# Get next element

To get the next element you can use the .next() (opens new window) method.

<ul>
    <li>Mark</li>
    <li class="anna">Anna</li>
    <li>Paul</li>
</ul>

If you are standing on the "Anna" element and you want to get the next element, "Paul", the .next() method will allow you to do that.

// "Paul" now has green text
$(".anna").next().css("color", "green");

The method takes an optional selector argument, which can be used if the next element must be a certain kind of element.

// Next element is a "li", "Paul" now has green text
$(".anna").next("li").css("color", "green");

If the next element is not of the type selector then an empty set is returned, and the modifications will not do anything.

// Next element is not a ".mark", nothing will be done in this case
$(".anna").next(".mark").css("color", "green");

# Get previous element

To get the previous element you can use the .prev() (opens new window) method.

<ul>
    <li>Mark</li>
    <li class="anna">Anna</li>
    <li>Paul</li>
</ul>

If you are standing on the "Anna" element and you want to get the previous element, "Mark", the .prev() method will allow you to do that.

// "Mark" now has green text
$(".anna").prev().css("color", "green");

The method takes an optional selector argument, which can be used if the previous element must be a certain kind of element.

// Previous element is a "li", "Mark" now has green text
$(".anna").prev("li").css("color", "green");

If the previous element is not of the type selector then an empty set is returned, and the modifications will not do anything.

// Previous element is not a ".paul", nothing will be done in this case
$(".anna").prev(".paul").css("color", "green");

# Filter a selection

To filter a selection you can use the .filter() (opens new window) method.

The method is called on a selection and returns a new selection. If the filter matches an element then it is added to the returned selection, otherwise it is ignored. If no element is matched then an empty selection is returned.

# The HTML

This is the HTML we will be using.

<ul>
    <li class="zero">Zero</li>
    <li class="one">One</li>
    <li class="two">Two</li>
    <li class="three">Three</li>
</ul>

# Selector

Filtering using selectors (opens new window) is one of the simpler ways to filter a selection.

$("li").filter(":even").css("color", "green"); // Color even elements green
$("li").filter(".one").css("font-weight", "bold"); // Make ".one" bold

# Function

Filtering a selection using a function (opens new window) is useful if it is not possible to use selectors.

The function is called for each element in the selection. If it returns a true value then the element will be added to the returned selection.

var selection = $("li").filter(function (index, element) {
    // "index" is the position of the element
    // "element" is the same as "this"
    return $(this).hasClass("two");
});
selection.css("color", "green"); // ".two" will be colored green

# Elements

You can filter by DOM elements. If the DOM elements are in the selection then they will be included in the returned selection.

var three = document.getElementsByClassName("three");
$("li").filter(three).css("color", "green");

# Selection

You can also filter a selection by another selection. If an element is in both selections then it will be included in the returned selection.

var elems = $(".one, .three");
$("li").filter(elems).css("color", "green");

# find() method

.find() method allows us to search through the descendants of these elements in the DOM tree and construct a new jQuery object from the matching elements.

HTML


    <div class="parent">
        <div class="children" name="first">
            <ul>
                <li>A1</li>
                <li>A2</li>
                <li>A3</li>
            </ul>
        </div>
        <div class="children" name="second">
            <ul>
                <li>B1</li>
                <li>B2</li>
                <li>B3</li>
            </ul>
        </div>
       </div>

jQuery


$('.parent').find('.children[name="second"] ul li').css('font-weight','bold');

Output

- A1
- A2
- A3

- **B1**
- **B2**
- **B3**