HTML Element querySelectorAll()
Method: Getting All Matching Child Elements
The querySelectorAll()
method is a powerful tool in the arsenal of any web developer working with the Document Object Model (DOM). It allows you to select all elements within a specific parent element that match a specified CSS selector. This method provides a dynamic NodeList
of elements, making it easier to manipulate multiple elements at once. In this comprehensive guide, we’ll explore the syntax, usage, and practical examples of the querySelectorAll()
method.
What is the querySelectorAll()
Method?
The querySelectorAll()
method is a part of the HTML Element interface, which returns a static (not live) NodeList
representing a list of the document’s elements that match the specified group of selectors. Unlike querySelector()
, which returns only the first matching element, querySelectorAll()
returns all matching elements as a NodeList
.
Purpose of the querySelectorAll()
Method
The primary purpose of querySelectorAll()
is to:
- Select multiple elements based on CSS selectors.
- Retrieve all matching child elements within a specific parent element.
- Provide a
NodeList
that can be iterated over to perform operations on each selected element. - Enable complex selection scenarios using CSS selector syntax.
Syntax of querySelectorAll()
The syntax for using the querySelectorAll()
method is straightforward:
element.querySelectorAll(selectors);
Where:
element
: The parent HTML element from which to search for matching child elements.selectors
: A string containing one or more CSS selectors to match against. These can be tag names, class names, IDs, attribute selectors, or any valid CSS selector.
Parameters
Parameter | Type | Description |
---|---|---|
`selectors` | String | A string containing one or more CSS selectors. Multiple selectors can be separated by commas. |
Return Value
NodeList
: A non-liveNodeList
containing all elements that match the specified selectors, in the order they appear in the document. If no elements match, an emptyNodeList
is returned.
Examples of Using querySelectorAll()
Let’s explore several examples to illustrate how to use the querySelectorAll()
method effectively.
Selecting Elements by Tag Name
The simplest use case is selecting elements by their tag name.
<div id="fruits">
<p>Apple</p>
<p>Banana</p>
<p>Orange</p>
</div>
<script>
const fruits_div = document.getElementById("fruits");
const paragraphs_fruit = fruits_div.querySelectorAll("p");
paragraphs_fruit.forEach((paragraph) => {
paragraph.style.color = "green";
});
</script>
In this example, all <p>
elements within the fruits
div are selected and their text color is changed to green.
Selecting Elements by Class Name
You can select elements by their class name using the .
prefix in the selector.
<div id="animals">
<span class="mammal">Dog</span>
<span class="mammal">Cat</span>
<span class="bird">Eagle</span>
</div>
<script>
const animals_div = document.getElementById("animals");
const mammals_animal = animals_div.querySelectorAll(".mammal");
mammals_animal.forEach((mammal) => {
mammal.style.fontWeight = "bold";
});
</script>
Here, all elements with the class mammal
within the animals
div are selected and their font weight is set to bold.
Selecting Elements by ID
Although less common since IDs are unique, querySelectorAll()
can also select elements by their ID using the #
prefix.
<div id="cities">
<span id="tokyo">Tokyo</span>
<span id="paris">Paris</span>
<span id="london">London</span>
</div>
<script>
const cities_div = document.getElementById("cities");
const tokyo_city = cities_div.querySelectorAll("#tokyo");
tokyo_city.forEach((city) => {
city.style.fontSize = "1.2em";
});
</script>
In this case, the element with the ID tokyo
within the cities
div is selected and its font size is increased.
Selecting Elements by Attribute
You can select elements based on the presence or value of their attributes.
<div id="products">
<a href="#" data-product="Laptop">Laptop</a>
<a href="#" data-product="Phone">Phone</a>
<a href="#" data-product="Tablet">Tablet</a>
</div>
<script>
const products_div = document.getElementById("products");
const data_product = products_div.querySelectorAll("[data-product]");
data_product.forEach((product) => {
product.style.textDecoration = "none";
});
</script>
Here, all <a>
elements with the data-product
attribute within the products
div are selected, and their text decoration is removed.
Selecting Multiple Types of Elements
querySelectorAll()
can accept multiple selectors separated by commas, allowing you to select different types of elements in a single call.
<div id="content">
<h1>Title</h1>
<p class="highlight">Paragraph 1</p>
<p>Paragraph 2</p>
<span class="highlight">Span</span>
</div>
<script>
const content_div = document.getElementById("content");
const highlights_content = content_div.querySelectorAll("h1, .highlight");
highlights_content.forEach((element) => {
element.style.backgroundColor = "yellow";
});
</script>
In this example, all <h1>
elements and elements with the class highlight
within the content
div are selected, and their background color is set to yellow.
Using Advanced CSS Selectors
querySelectorAll()
supports advanced CSS selectors, allowing for more complex selection scenarios.
<div id="container">
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<p>Some text</p>
</div>
<script>
const container_div = document.getElementById("container");
const list_child_li = container_div.querySelectorAll("ul > li:nth-child(odd)");
list_child_li.forEach((item) => {
item.style.color = "blue";
});
</script>
Here, odd list items (<li>
) that are direct children of <ul>
within the container
div are selected, and their text color is set to blue.
Practical Examples
Highlighting Search Results
A common use case for querySelectorAll()
is highlighting search results on a page.
<div id="searchable">
<p>This is a paragraph about JavaScript.</p>
<p>JavaScript is a powerful language.</p>
<p>Learn more about JavaScript.</p>
</div>
<input type="text" id="searchInput" placeholder="Search..." />
<button id="searchButton">Search</button>
<script>
const searchable_div = document.getElementById("searchable");
const searchInput_input = document.getElementById("searchInput");
const searchButton_button = document.getElementById("searchButton");
searchButton_button.addEventListener("click", function () {
const searchTerm = searchInput_input.value.toLowerCase();
const paragraphs_searchable = searchable_div.querySelectorAll("p");
paragraphs_searchable.forEach((paragraph) => {
const text = paragraph.textContent.toLowerCase();
if (text.includes(searchTerm)) {
paragraph.innerHTML = paragraph.innerHTML.replace(
new RegExp(searchTerm, "gi"),
`<span style="background-color: yellow;">${searchTerm}</span>`
);
}
});
});
</script>
In this example, when the search button is clicked, the script searches for the entered term within the paragraphs and highlights the matches.
Dynamic Form Validation
querySelectorAll()
can be used to dynamically validate form inputs based on certain criteria.
<form id="myForm">
<input type="text" class="validate" data-pattern="[A-Za-z]+" placeholder="Only letters" /><br />
<input type="email" class="validate" data-pattern="^[^\s@]+@[^\s@]+\.[^\s@]+$" placeholder="Valid email" /><br />
<button type="submit">Submit</button>
</form>
<script>
const myForm_form = document.getElementById("myForm");
myForm_form.addEventListener("submit", function (event) {
const validate_inputs = myForm_form.querySelectorAll(".validate");
let isValid = true;
validate_inputs.forEach((input) => {
const pattern = input.getAttribute("data-pattern");
const regex = new RegExp(pattern);
if (!regex.test(input.value)) {
input.style.borderColor = "red";
isValid = false;
} else {
input.style.borderColor = "green";
}
});
if (!isValid) {
event.preventDefault();
alert("Please correct the invalid fields.");
}
});
</script>
Here, the script validates the form inputs against the specified data patterns and highlights invalid fields in red.
Best Practices
- Specificity: Use specific selectors to avoid unintended selections.
- Performance: While
querySelectorAll()
is powerful, using overly complex selectors can impact performance, especially in large documents. Optimize selectors for better performance. - Readability: Keep selectors readable and maintainable. Avoid overly long or cryptic selectors.
- Context: Always use
querySelectorAll()
within a specific element context rather than the entire document (document.querySelectorAll
) to improve performance and avoid unexpected results. - NodeList is Static: Remember that
querySelectorAll()
returns a staticNodeList
. If the DOM changes after theNodeList
is created, theNodeList
will not reflect these changes.
Common Mistakes to Avoid
- Confusing with
getElementsByClassName
andgetElementsByTagName
: Unlike these methods,querySelectorAll()
uses CSS selectors and returns aNodeList
, not anHTMLCollection
. - Forgetting the
.
or#
prefix: When selecting by class or ID, remember to include the.
or#
prefix in the selector. - Assuming a live collection: The
NodeList
returned byquerySelectorAll()
is static, not live. Changes to the DOM will not be reflected in theNodeList
.
Browser Support
The querySelectorAll()
method is widely supported across modern browsers:
- Chrome
- Firefox
- Safari
- Edge
- Opera
Conclusion
The querySelectorAll()
method is an essential tool for web developers, offering a flexible and powerful way to select multiple elements based on CSS selectors. By understanding its syntax, usage, and best practices, you can efficiently manipulate and interact with elements in the DOM, creating dynamic and engaging web experiences.