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 trialDaniel Grieve
6,432 PointsquerySelector result vs getElementByClassName result
During the extra-credit task to disable the up/down buttons I came across a discrepancy between querySelector and getElementByClassName methods. Putting these into the console I get the following result...
links[0].querySelector('.up');
<button class="up" disabled style="background-color: lightgrey;">up</button>
links[0].getElementsByClassName('.up');
HTMLCollection []length: 0__proto__: HTMLCollection
I don't understand why one would retrieve the button I want vs the other which returns an empty HTML collection. My variables are defined as...
const listUl = document.querySelector('ul');
const links = listUl.children;
2 Answers
Stefan Lazarevic
1,959 Pointslinks[0].getElementsByClassName('.up');
When you use method "getElementsByClassName" you do not need to provide "." (dot) Dot is a representation of class when using querySelector because querySelector can be used to target id's too using #
Same as you don't provide # when using getElementById you don't need to add "." when targeting class using getElementsByClassName.
Additional note: getElementsByClassName returns collection of elements with targeted class, just like querySelectorAll, so you will need to access targeted element with index position [0] or so.
andren
28,558 PointsThe querySelector
expects a CSS selector as the criteria to search for, while getElementsByClassName
expects the name of the class you are searching for. Since you passed .up
(which is a valid CSS selector, but not actually the name of the class) to both of the methods only the querySelector
found the element you were searching for.
And the querySelector
always returns a single element, even if multiple ones are found one the page. The getElementsByClassName
is pretty much the opposite, it will always returns a collection of HTML elements, even if only one or fewer elements is found matching your criteria.
That is the reason for the difference in types being returned.
If you pass the class name to getElementsByClassName
like this:
links[0].getElementsByClassName('up'); // Removed dot in beginning of string
Then you would get a collection containing the element you where looking for.
Daniel Grieve
6,432 PointsThank you for the reply!
Daniel Grieve
6,432 PointsDaniel Grieve
6,432 PointsThanks for the reply!