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 trialSara Masek
Front End Web Development Techdegree Student 11,513 PointsDifficulty 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!
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";
}
}
});
<!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
Full Stack JavaScript Techdegree Graduate 32,220 PointsHey 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")
}
});
Sara Masek
Front End Web Development Techdegree Student 11,513 PointsThanks for responding Jason! I was able to get assistance on slack but I like your answer too, it makes a lot of sense!