Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

JavaScript JavaScript and the DOM (Retiring) Traversing the DOM Sibling Traversal

Sara Masek
seal-mask
.a{fill-rule:evenodd;}techdegree
Sara Masek
Front End Web Development Techdegree Student 11,513 Points

Difficulty accessing the previous sibling element in an addEventListener function

I'm having difficulty on one of the challenge exercises regarding manipulating javascript and the DOM. Here's the question from the exercise:

"The <ul> stored in the variable list has a click event listener that targets each <button> in the list. Complete the code to add a class of highlight to a <p> element that's an immediate previous sibling of the button being clicked."

My issue is that the code I've written inside the function will highlight one of the <p> elements but it won't highlight any others. What should happen is when I press any button the page will highlight the previous <p>.

I'm still very new to manipulating the DOM through javascript so any help or insight is appreciated, thanks!

app.js
var list = document.getElementsByTagName('ul')[0];

list.addEventListener('click', function(e) {
  if (e.target.tagName == 'BUTTON') {
    let p = e.target.parentNode;
    //let p = document.querySelector('ul p');
    let prevP = p.previousElementSibling;
    let ul = p.parentNode;

    if( ul.insertBefore(p, prevP)){
        p.className = "highlight";
    }

  }
});
index.html
<!DOCTYPE html>
<html>
    <head>
        <title>JavaScript and the DOM</title>
    </head>
    <link rel="stylesheet" href="style.css" />
    <body>
        <section>
            <h1>Making a Webpage Interactive</h1>
            <p>Things to Learn</p>
            <ul>
                <li><p>Element Selection</p><button>Highlight</button></li>
                <li><p>Events</p><button>Highlight</button></li>
                <li><p>Event Listening</p><button>Highlight</button></li>
                <li><p>DOM Traversal</p><button>Highlight</button></li>
            </ul>
        </section>
        <script src="app.js"></script>
    </body>
</html>

2 Answers

Jason Miller
seal-mask
.a{fill-rule:evenodd;}techdegree seal-36
Jason Miller
Full Stack JavaScript Techdegree Graduate 32,220 Points

Hey Sara Masek, DOM traversal and manipulation can be a bit tricky but you'll get it eventually with practice. So in this challenge, A click event listener is set on the list variable, which is a <ul>. But the event only fires if e.target is a button element. So you're supposed to get the button's previous sibling which in this case is a <p> and add the class highlight.

var list = document.getElementsByTagName('ul')[0];

list.addEventListener('click', function(e) {
  if (e.target.tagName == 'BUTTON') {
    e.target.previousElementSibling.classList.add("highlight")
  }
});