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 trialRenee Versteegen
16,408 PointsPractice Selecting Elements - challenge task 1
Task 1 of this challenge asks you to select all links in the nav element and assign them to navigationLinks.
The accepted answer is:
let navigationLinks = document.querySelectorAll('nav a');
I did:
let navigationLinks = nav.getElementsByTagName('a');
which seems to work just as well as the suggested answer when I test it, and there are similar examples in the MDN documentation, but the challenge gives an error message, saying 'nav is not a variable'. (I know it isn't, it's an element, but the method works on any element according to MDN; it says: "The subtree underneath the specified element is searched, excluding the element itself.")
So now I'm curious as to why my solution would be considered wrong, or maybe just unusual.
let navigationLinks = nav.getElementsByTagName('a');
let galleryLinks;
let footerImages;
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Nick Pettit | Designer</title>
<link rel="stylesheet" href="css/normalize.css">
<link href='http://fonts.googleapis.com/css?family=Changa+One|Open+Sans:400italic,700italic,400,700,800' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/responsive.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<header>
<a href="index.html" id="logo">
<h1>Nick Pettit</h1>
<h2>Designer</h2>
</a>
<nav>
<ul>
<li><a href="index.html" class="selected">Portfolio</a></li>
<li><a href="about.html">About</a></li>
<li><a href="contact.html">Contact</a></li>
</ul>
</nav>
</header>
<div id="wrapper">
<section>
<ul id="gallery">
<li>
<a href="img/numbers-01.jpg">
<img src="img/numbers-01.jpg" alt="">
<p>Experimentation with color and texture.</p>
</a>
</li>
<li>
<a href="img/numbers-02.jpg">
<img src="img/numbers-02.jpg" alt="">
<p>Playing with blending modes in Photoshop.</p>
</a>
</li>
</ul>
</section>
<footer>
<a href="http://twitter.com/nickrp"><img src="img/twitter-wrap.png" alt="Twitter Logo" class="social-icon"></a>
<a href="http://facebook.com/nickpettit"><img src="img/facebook-wrap.png" alt="Facebook Logo" class="social-icon"></a>
<p>© 2016 Nick Pettit.</p>
</footer>
</div>
<script src="js/app.js"></script>
</body>
</html>
2 Answers
Steven Parker
231,269 PointsYou wrote, "but the method works on any element according to MDN". This is true, but the code still needs a variable to serve as a reference to the element.
You could do something like this first, to establish the nav variable as a reference to the nav
element:
let nav = document.getElementsByTagName('nav')[0];
If you add that as the top line, your code will pass the challenge.
Renee Versteegen
16,408 PointsIt's perfectly clear now. thanks very much :)
Renee Versteegen
16,408 PointsRenee Versteegen
16,408 PointsHey thanks for your answer, but I tested my code and it also works they way I wrote it. I don't see any difference in behavior when I use my solution or when I use Treehouse's suggested answer. And there's a similar example on this MDN page https://developer.mozilla.org/en-US/docs/Web/API/Element/getElementsByTagName where they call the method directly on the table element. var cells = table.getElementsByTagName("td"); I guess this is just an unusual way of doing this then. :)
Steven Parker
231,269 PointsSteven Parker
231,269 PointsIn the MDN page example, the line just above the one you quoted is:
var table = document.getElementById("forecast-table");
This establishes the "table" variable just like the line I gave you above would establish the "nav" variable. In both cases these lines are needed to create a variable to serve as a reference to the element.
But you're right that using getElementsByTagName twice or using querySelectorAll once both generate the same result and perform exactly the same. The latter approach has two advantages unrelated to functionality:
And your method is certainly not unusual, you might even call it the "classic" approach.