π What is DOM Selection?
DOM selection means finding HTML elements using JavaScript so that we can read, modify, or manipulate them (change text, style, attributes, etc.).
π 1. getElementById()
βοΈ Purpose: Selects one element using its unique id.
document.getElementById("id");π§ͺ Example
<p id="message">Hello World</p>const text = document.getElementById("message");
console.log(text);<p id="message">Hello World</p>π Explanation
IDs are unique
Returns a single element
Fastest and most commonly used
π 2. getElementsByClassName()
βοΈ Purpose: Selects multiple elements having the same class name.
document.getElementsByClassName("className");π§ͺ Example
<p class="item">Apple</p>
<p class="item">Banana</p>const items = document.getElementsByClassName("item");
console.log(items);HTMLCollection(2) [p.item, p.item]π Explanation
Returns HTMLCollection
You must access elements using index
Not an array
console.log(items[0].textContent);Appleπ 3. getElementsByTagName()
βοΈ Purpose: Selects elements by their HTML tag name.
document.getElementsByTagName("tagName");π§ͺ Example
<h1>Title</h1>
<h1>Subtitle</h1>const headings = document.getElementsByTagName("h1");
console.log(headings.length);2π Explanation
Returns HTMLCollection
Useful when selecting all same tag elements
π 4. querySelector()
βοΈ Purpose: Selects the first matching element using CSS selectors.
document.querySelector("selector");π§ͺ Example
<p class="info">First</p>
<p class="info">Second</p>const para = document.querySelector(".info");
console.log(para.textContent);Firstπ Explanation
Uses CSS selectors
Returns only the first match
Very flexible and modern
π 5. querySelectorAll()
βοΈ Purpose: Selects all matching elements using CSS selectors.
document.querySelectorAll("selector");π§ͺ Example
<li>One</li>
<li>Two</li>
<li>Three</li>const listItems = document.querySelectorAll("li");
console.log(listItems);NodeList(3) [li, li, li]π Explanation
Returns a NodeList
Can use
forEach()
listItems.forEach(item => {
console.log(item.textContent);
});One
Two
Three<div class="infographic-domselect">
<style>
.infographic-domselect {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--good: #1a8a5f;
--good-soft: #e1f2ea;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: 'Inter', system-ui, sans-serif;
color: var(--ink);
background: var(--paper);
overflow-x: hidden;
}
.infographic-domselect[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--good: #4fbf8f;
--good-soft: #16281f;
}
.infographic-domselect * { box-sizing: border-box; }
.infographic-domselect h1 { font-family: 'Fraunces', Georgia, serif; font-weight: 600; margin: 0; }
.infographic-domselect p { margin: 0; }
.infographic-domselect button { font-family: inherit; }
.ds-wrap { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1.1rem, 5vw, 3rem) 2rem; }
.ds-hero { text-align: center; margin-bottom: 1.2rem; }
.ds-hero h1 { font-size: clamp(1.35rem, 4.5vw, 1.85rem); }
.ds-hero p { color: var(--ink-soft); margin-top: 0.4rem; font-size: 0.84rem; }
.ds-tabs { display: flex; flex-wrap: wrap; gap: 0.35rem; justify-content: center; margin-bottom: 1.2rem; }
.ds-tab { border: 1px solid var(--line); background: var(--paper-alt); color: var(--ink-soft); padding: 0.36rem 0.6rem; font-size: 0.64rem; font-weight: 700; cursor: pointer; font-family: 'IBM Plex Mono', monospace; }
.ds-tab.is-active { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); }
.ds-tab:hover:not(.is-active) { border-color: var(--ink-soft); color: var(--ink); }
.ds-panel { display: none; }
.ds-panel.is-active { display: block; }
/* mini rendered page */
.ds-page { border: 1.5px solid var(--line); background: var(--paper-alt); border-radius: 6px; overflow: hidden; margin-bottom: 1rem; }
.ds-page-bar { background: #2b2b2b; padding: 0.4rem 0.6rem; display: flex; gap: 0.3rem; }
.ds-page-dot { width: 8px; height: 8px; border-radius: 50%; background: #555; }
.ds-page-body { padding: 0.9rem 1rem; background: var(--paper); }
.ds-el {
border: 1.5px dashed var(--line); border-radius: 4px; padding: 0.35rem 0.55rem; margin-bottom: 0.4rem;
font-size: 0.8rem; color: var(--ink); position: relative; transition: border-color 0.35s ease, background 0.35s ease, box-shadow 0.35s ease, opacity 0.3s ease;
}
.ds-el .ds-tag { font-family: 'IBM Plex Mono', monospace; font-size: 0.58rem; color: var(--ink-soft); display: block; margin-bottom: 0.1rem; }
.ds-el.is-found { border-style: solid; border-color: var(--accent); background: var(--accent-soft); box-shadow: 0 0 0 3px var(--accent-soft); }
.ds-el.is-first { border-style: solid; border-color: var(--good); background: var(--good-soft); box-shadow: 0 0 0 3px var(--good-soft); }
.ds-el.is-dim { opacity: 0.4; }
/* code */
.ds-code { background: #1e1e1e; color: #d4d4d4; border-radius: 5px; padding: 0.6rem 0.8rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.68rem; line-height: 1.6; margin-bottom: 1rem; white-space: pre; overflow-x: auto; }
.tok-kw { color: #569cd6; }
.tok-fn { color: #dcdcaa; }
.tok-str { color: #ce9178; }
.tok-var { color: #9cdcfe; }
.tok-punc { color: #d4d4d4; }
.tok-num { color: #b5cea8; }
.ds-play { display: block; margin: 0 auto; border: none; background: var(--accent); color: #fff; padding: 0.5rem 1.2rem; font-size: 0.8rem; font-weight: 600; cursor: pointer; }
.ds-play:active { transform: scale(0.96); }
.ds-play:disabled { opacity: 0.45; cursor: default; }
.ds-console { margin: 1rem auto 0; max-width: 360px; text-align: left; border: 1.5px solid var(--line); background: var(--paper-alt); padding: 0.5rem 0.75rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.68rem; min-height: 1.8em; }
.ds-console .ds-cline { opacity: 0; transition: opacity 0.25s ease; color: var(--good); display: block; }
.ds-console .ds-cline.is-shown { opacity: 1; }
.ds-note { text-align: center; font-size: 0.78rem; color: var(--ink-soft); padding-top: 1.3rem; }
.ds-note strong { color: var(--ink); }
@media (prefers-reduced-motion: reduce) {
.infographic-domselect *, .infographic-domselect *::before, .infographic-domselect *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="ds-wrap">
<div class="ds-hero">
<h1>Selecting elements from the DOM</h1>
<p>Five ways in, same mini page, very different return values.</p>
</div>
<div class="ds-tabs">
<button class="ds-tab is-active" data-tab="id" type="button">getElementById</button>
<button class="ds-tab" data-tab="class" type="button">getElementsByClassName</button>
<button class="ds-tab" data-tab="tag" type="button">getElementsByTagName</button>
<button class="ds-tab" data-tab="qs" type="button">querySelector</button>
<button class="ds-tab" data-tab="qsa" type="button">querySelectorAll</button>
</div>
<!-- getElementById -->
<div class="ds-panel is-active" data-panel="id">
<div class="ds-page">
<div class="ds-page-bar"><div class="ds-page-dot"></div><div class="ds-page-dot"></div><div class="ds-page-dot"></div></div>
<div class="ds-page-body">
<div class="ds-el"><span class="ds-tag"><h1></span>My Page</div>
<div class="ds-el" id="idTarget"><span class="ds-tag"><p id="message"></span>Hello World</div>
<div class="ds-el"><span class="ds-tag"><p></span>Just a regular paragraph</div>
</div>
</div>
<div class="ds-code"><span class="tok-kw">const</span> <span class="tok-var">text</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">getElementById</span><span class="tok-punc">(</span><span class="tok-str">"message"</span><span class="tok-punc">);</span>
<span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-var">text</span><span class="tok-punc">);</span></div>
<button class="ds-play" data-run="id" type="button">run</button>
<div class="ds-console"><span class="ds-cline" id="idOut"><p id="message">Hello World</p></span></div>
<p class="ds-note">Returns <strong>one</strong> element β ids are unique.</p>
</div>
<!-- getElementsByClassName -->
<div class="ds-panel" data-panel="class">
<div class="ds-page">
<div class="ds-page-bar"><div class="ds-page-dot"></div><div class="ds-page-dot"></div><div class="ds-page-dot"></div></div>
<div class="ds-page-body">
<div class="ds-el" data-grp="class"><span class="ds-tag"><p class="item"></span>Apple</div>
<div class="ds-el" data-grp="class"><span class="ds-tag"><p class="item"></span>Banana</div>
<div class="ds-el"><span class="ds-tag"><p></span>Cherry β no class</div>
</div>
</div>
<div class="ds-code"><span class="tok-kw">const</span> <span class="tok-var">items</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">getElementsByClassName</span><span class="tok-punc">(</span><span class="tok-str">"item"</span><span class="tok-punc">);</span>
<span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-var">items</span><span class="tok-punc">);</span>
<span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-var">items</span><span class="tok-punc">[</span><span class="tok-num">0</span><span class="tok-punc">].</span><span class="tok-var">textContent</span><span class="tok-punc">);</span></div>
<button class="ds-play" data-run="class" type="button">run</button>
<div class="ds-console">
<span class="ds-cline" id="classOut1">HTMLCollection(2) [p.item, p.item]</span>
<span class="ds-cline" id="classOut2">"Apple"</span>
</div>
<p class="ds-note">Returns an <strong>HTMLCollection</strong> β index into it, it's not a real array.</p>
</div>
<!-- getElementsByTagName -->
<div class="ds-panel" data-panel="tag">
<div class="ds-page">
<div class="ds-page-bar"><div class="ds-page-dot"></div><div class="ds-page-dot"></div><div class="ds-page-dot"></div></div>
<div class="ds-page-body">
<div class="ds-el" data-grp="tag"><span class="ds-tag"><h1></span>Title</div>
<div class="ds-el" data-grp="tag"><span class="ds-tag"><h1></span>Subtitle</div>
<div class="ds-el"><span class="ds-tag"><p></span>Not an h1</div>
</div>
</div>
<div class="ds-code"><span class="tok-kw">const</span> <span class="tok-var">headings</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">getElementsByTagName</span><span class="tok-punc">(</span><span class="tok-str">"h1"</span><span class="tok-punc">);</span>
<span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-var">headings</span><span class="tok-punc">.</span><span class="tok-var">length</span><span class="tok-punc">);</span></div>
<button class="ds-play" data-run="tag" type="button">run</button>
<div class="ds-console"><span class="ds-cline" id="tagOut">2</span></div>
<p class="ds-note">Also an <strong>HTMLCollection</strong> β every element with that tag.</p>
</div>
<!-- querySelector -->
<div class="ds-panel" data-panel="qs">
<div class="ds-page">
<div class="ds-page-bar"><div class="ds-page-dot"></div><div class="ds-page-dot"></div><div class="ds-page-dot"></div></div>
<div class="ds-page-body">
<div class="ds-el" data-grp="qs" data-first="true"><span class="ds-tag"><p class="info"></span>First</div>
<div class="ds-el" data-grp="qs"><span class="ds-tag"><p class="info"></span>Second</div>
</div>
</div>
<div class="ds-code"><span class="tok-kw">const</span> <span class="tok-var">para</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">querySelector</span><span class="tok-punc">(</span><span class="tok-str">".info"</span><span class="tok-punc">);</span>
<span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-var">para</span><span class="tok-punc">.</span><span class="tok-var">textContent</span><span class="tok-punc">);</span></div>
<button class="ds-play" data-run="qs" type="button">run</button>
<div class="ds-console"><span class="ds-cline" id="qsOut">"First"</span></div>
<p class="ds-note">CSS selectors, but only the <strong>first</strong> match β the second stays untouched.</p>
</div>
<!-- querySelectorAll -->
<div class="ds-panel" data-panel="qsa">
<div class="ds-page">
<div class="ds-page-bar"><div class="ds-page-dot"></div><div class="ds-page-dot"></div><div class="ds-page-dot"></div></div>
<div class="ds-page-body">
<div class="ds-el" data-grp="qsa"><span class="ds-tag"><li></span>One</div>
<div class="ds-el" data-grp="qsa"><span class="ds-tag"><li></span>Two</div>
<div class="ds-el" data-grp="qsa"><span class="ds-tag"><li></span>Three</div>
</div>
</div>
<div class="ds-code"><span class="tok-kw">const</span> <span class="tok-var">listItems</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">querySelectorAll</span><span class="tok-punc">(</span><span class="tok-str">"li"</span><span class="tok-punc">);</span>
<span class="tok-var">listItems</span><span class="tok-punc">.</span><span class="tok-fn">forEach</span><span class="tok-punc">(</span><span class="tok-var">item</span> <span class="tok-punc">=></span>
<span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-var">item</span><span class="tok-punc">.</span><span class="tok-var">textContent</span><span class="tok-punc">));</span></div>
<button class="ds-play" data-run="qsa" type="button">run</button>
<div class="ds-console">
<span class="ds-cline" id="qsaOut0">NodeList(3) [li, li, li]</span>
<span class="ds-cline" id="qsaOut1">One</span>
<span class="ds-cline" id="qsaOut2">Two</span>
<span class="ds-cline" id="qsaOut3">Three</span>
</div>
<p class="ds-note">Returns a real <strong>NodeList</strong> β <strong>forEach()</strong> works directly on it.</p>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-domselect')
|| document.querySelector('.infographic-domselect');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
/* tabs */
wrapper.querySelectorAll('.ds-tab').forEach(tab => {
tab.addEventListener('click', () => {
wrapper.querySelectorAll('.ds-tab').forEach(t => t.classList.remove('is-active'));
wrapper.querySelectorAll('.ds-panel').forEach(p => p.classList.remove('is-active'));
tab.classList.add('is-active');
wrapper.querySelector('.ds-panel[data-panel="' + tab.dataset.tab + '"]').classList.add('is-active');
});
});
function resetGroup(grp) {
wrapper.querySelectorAll('.ds-el[data-grp="' + grp + '"]').forEach(el => {
el.classList.remove('is-found', 'is-first', 'is-dim');
});
}
/* getElementById */
wrapper.querySelector('[data-run="id"]').addEventListener('click', () => {
const target = wrapper.querySelector('#idTarget');
const out = wrapper.querySelector('#idOut');
target.classList.remove('is-found');
out.classList.remove('is-shown');
void target.offsetWidth;
setTimeout(() => target.classList.add('is-found'), 60);
setTimeout(() => out.classList.add('is-shown'), 250);
});
/* getElementsByClassName */
wrapper.querySelector('[data-run="class"]').addEventListener('click', () => {
resetGroup('class');
const out1 = wrapper.querySelector('#classOut1');
const out2 = wrapper.querySelector('#classOut2');
out1.classList.remove('is-shown'); out2.classList.remove('is-shown');
setTimeout(() => {
wrapper.querySelectorAll('.ds-el[data-grp="class"]').forEach(el => el.classList.add('is-found'));
}, 60);
setTimeout(() => out1.classList.add('is-shown'), 250);
setTimeout(() => out2.classList.add('is-shown'), 700);
});
/* getElementsByTagName */
wrapper.querySelector('[data-run="tag"]').addEventListener('click', () => {
resetGroup('tag');
const out = wrapper.querySelector('#tagOut');
out.classList.remove('is-shown');
setTimeout(() => {
wrapper.querySelectorAll('.ds-el[data-grp="tag"]').forEach(el => el.classList.add('is-found'));
}, 60);
setTimeout(() => out.classList.add('is-shown'), 300);
});
/* querySelector */
wrapper.querySelector('[data-run="qs"]').addEventListener('click', () => {
resetGroup('qs');
const out = wrapper.querySelector('#qsOut');
out.classList.remove('is-shown');
setTimeout(() => {
wrapper.querySelectorAll('.ds-el[data-grp="qs"]').forEach(el => {
if (el.dataset.first === 'true') el.classList.add('is-first');
else el.classList.add('is-dim');
});
}, 60);
setTimeout(() => out.classList.add('is-shown'), 300);
});
/* querySelectorAll */
wrapper.querySelector('[data-run="qsa"]').addEventListener('click', () => {
resetGroup('qsa');
const outs = ['qsaOut0', 'qsaOut1', 'qsaOut2', 'qsaOut3'].map(id => wrapper.querySelector('#' + id));
outs.forEach(o => o.classList.remove('is-shown'));
setTimeout(() => {
wrapper.querySelectorAll('.ds-el[data-grp="qsa"]').forEach(el => el.classList.add('is-found'));
}, 60);
setTimeout(() => outs[0].classList.add('is-shown'), 300);
setTimeout(() => outs[1].classList.add('is-shown'), 650);
setTimeout(() => outs[2].classList.add('is-shown'), 950);
setTimeout(() => outs[3].classList.add('is-shown'), 1250);
});
})();
</script>π HTMLCollection vs NodeList
Feature | HTMLCollection | NodeList |
|---|---|---|
Returned by | getElementsBy* | querySelectorAll |
Live update | β Yes | β No |
forEach | β No | β Yes |
π Common Use Cases
// Change text
document.getElementById("title").textContent = "New Title";
// Change style
document.querySelector(".box").style.background = "blue";
// Loop through multiple elements
document.querySelectorAll(".item").forEach(el => {
el.style.color = "red";
});π§ Summary
getElementById()β Single elementgetElementsByClassName()β Multiple (HTMLCollection)getElementsByTagName()β Multiple by tagquerySelector()β First matchquerySelectorAll()β All matches (NodeList)