HTML elements have attributes (like id, class, src).
Using the DOM, JavaScript can get, set, check, or remove these attributes dynamically.
๐น 1. getAttribute()
๐ Reads the value of an attribute.
Syntax
element.getAttribute(attributeName);Example
<input id="username" type="text">const input = document.getElementById("username");
console.log(input.getAttribute("type"));text๐น 2. setAttribute()
๐ Adds or updates an attribute.
Syntax
element.setAttribute(name, value);Example
input.setAttribute("placeholder", "Enter username");Result in HTML
<input id="username" type="text" placeholder="Enter username">๐น 3. removeAttribute()
๐ Removes an attribute from an element.
Syntax
element.removeAttribute(name);Example
input.removeAttribute("placeholder");Result
The placeholder attribute is removed.
๐น 4. hasAttribute()
๐ Checks if an attribute exists.
Syntax
element.hasAttribute(name);Example
console.log(input.hasAttribute("id"));
console.log(input.hasAttribute("class"));true
false<div class="infographic-attrmethods">
<style>
.infographic-attrmethods {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--good: #1a8a5f;
--good-soft: #e1f2ea;
--bad: #c8452e;
--bad-soft: #f7e3df;
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-attrmethods[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;
--bad: #e0715a;
--bad-soft: #2e211d;
}
.infographic-attrmethods * { box-sizing: border-box; }
.infographic-attrmethods h1 { font-family: 'Fraunces', Georgia, serif; font-weight: 600; margin: 0; }
.infographic-attrmethods p { margin: 0; }
.infographic-attrmethods button { font-family: inherit; }
.am-wrap { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1.1rem, 5vw, 3rem) 2rem; }
.am-hero { text-align: center; margin-bottom: 1.2rem; }
.am-hero h1 { font-size: clamp(1.35rem, 4.5vw, 1.85rem); }
.am-hero p { color: var(--ink-soft); margin-top: 0.4rem; font-size: 0.84rem; }
.am-tabs { display: flex; flex-wrap: wrap; gap: 0.35rem; justify-content: center; margin-bottom: 1.2rem; }
.am-tab { border: 1px solid var(--line); background: var(--paper-alt); color: var(--ink-soft); padding: 0.34rem 0.6rem; font-size: 0.64rem; font-weight: 700; cursor: pointer; font-family: 'IBM Plex Mono', monospace; }
.am-tab.is-active { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); }
.am-tab:hover:not(.is-active) { border-color: var(--ink-soft); color: var(--ink); }
.am-panel { display: none; }
.am-panel.is-active { display: block; }
.am-page { border: 1.5px solid var(--line); background: var(--paper-alt); border-radius: 6px; overflow: hidden; margin-bottom: 1rem; }
.am-page-bar { background: #2b2b2b; padding: 0.4rem 0.6rem; display: flex; gap: 0.3rem; }
.am-page-dot { width: 8px; height: 8px; border-radius: 50%; background: #555; }
.am-page-body { padding: 1rem; background: var(--paper); text-align: center; }
.am-input-mock { display: inline-block; border: 1.5px solid var(--line); border-radius: 4px; padding: 0.4rem 0.7rem; font-size: 0.8rem; color: var(--ink-soft); background: var(--paper-alt); min-width: 160px; text-align: left; }
.am-chips { display: flex; justify-content: center; gap: 0.4rem; margin-top: 0.7rem; flex-wrap: wrap; }
.am-chip { font-family: 'IBM Plex Mono', monospace; font-size: 0.66rem; padding: 0.25rem 0.55rem; border: 1.5px solid var(--line); color: var(--ink-soft); background: var(--paper); transition: border-color 0.35s ease, background 0.35s ease, color 0.35s ease, opacity 0.35s ease, transform 0.35s ease; }
.am-chip.is-hit { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); }
.am-chip.is-new { opacity: 0; transform: scale(0.85); }
.am-chip.is-new.is-shown { opacity: 1; transform: scale(1); border-color: var(--good); background: var(--good-soft); color: var(--good); }
.am-chip.is-removing { border-color: var(--bad); background: var(--bad-soft); color: var(--bad); text-decoration: line-through; }
.am-chip.is-gone { opacity: 0; transform: scale(0.7); }
.am-chip.is-true { border-color: var(--good); background: var(--good-soft); color: var(--good); }
.am-chip.is-false { border-color: var(--bad); background: var(--bad-soft); color: var(--bad); opacity: 0.6; }
.am-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; }
.am-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; }
.am-play:active { transform: scale(0.96); }
.am-playrow { display: flex; gap: 0.6rem; justify-content: center; flex-wrap: wrap; }
.am-console { margin: 1rem auto 0; max-width: 300px; 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; }
.am-console .am-cline { opacity: 0; transition: opacity 0.25s ease; display: block; }
.am-console .am-cline.is-shown { opacity: 1; }
.am-console .am-cline.good { color: var(--good); }
.am-console .am-cline.bad { color: var(--bad); }
.am-note { text-align: center; font-size: 0.78rem; color: var(--ink-soft); padding-top: 1.3rem; }
.am-note strong { color: var(--ink); }
@media (prefers-reduced-motion: reduce) {
.infographic-attrmethods *, .infographic-attrmethods *::before, .infographic-attrmethods *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="am-wrap">
<div class="am-hero">
<h1>Reading and writing attributes</h1>
<p>One <input>, four ways to inspect or change what's on it.</p>
</div>
<div class="am-tabs">
<button class="am-tab is-active" data-tab="get" type="button">getAttribute</button>
<button class="am-tab" data-tab="set" type="button">setAttribute</button>
<button class="am-tab" data-tab="remove" type="button">removeAttribute</button>
<button class="am-tab" data-tab="has" type="button">hasAttribute</button>
</div>
<!-- getAttribute -->
<div class="am-panel is-active" data-panel="get">
<div class="am-page">
<div class="am-page-bar"><div class="am-page-dot"></div><div class="am-page-dot"></div><div class="am-page-dot"></div></div>
<div class="am-page-body">
<div class="am-input-mock"><input id="username" type="text"></div>
<div class="am-chips">
<div class="am-chip" id="g-id">id="username"</div>
<div class="am-chip" id="g-type">type="text"</div>
</div>
</div>
</div>
<div class="am-code"><span class="tok-kw">const</span> <span class="tok-var">input</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">"username"</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">input</span><span class="tok-punc">.</span><span class="tok-fn">getAttribute</span><span class="tok-punc">(</span><span class="tok-str">"type"</span><span class="tok-punc">));</span></div>
<button class="am-play" data-run="get" type="button">run</button>
<div class="am-console"><span class="am-cline good" id="outGet">"text"</span></div>
<p class="am-note">Reads whatever's actually written in the HTML attribute.</p>
</div>
<!-- setAttribute -->
<div class="am-panel" data-panel="set">
<div class="am-page">
<div class="am-page-bar"><div class="am-page-dot"></div><div class="am-page-dot"></div><div class="am-page-dot"></div></div>
<div class="am-page-body">
<div class="am-input-mock"><input id="username" type="text"></div>
<div class="am-chips">
<div class="am-chip is-hit">id="username"</div>
<div class="am-chip is-hit">type="text"</div>
<div class="am-chip is-new" id="s-placeholder">placeholder="Enter username"</div>
</div>
</div>
</div>
<div class="am-code"><span class="tok-var">input</span><span class="tok-punc">.</span><span class="tok-fn">setAttribute</span><span class="tok-punc">(</span><span class="tok-str">"placeholder"</span><span class="tok-punc">,</span> <span class="tok-str">"Enter username"</span><span class="tok-punc">);</span></div>
<button class="am-play" data-run="set" type="button">run</button>
<p class="am-note">Adds a brand new attribute โ or overwrites it, if it's already there.</p>
</div>
<!-- removeAttribute -->
<div class="am-panel" data-panel="remove">
<div class="am-page">
<div class="am-page-bar"><div class="am-page-dot"></div><div class="am-page-dot"></div><div class="am-page-dot"></div></div>
<div class="am-page-body">
<div class="am-input-mock"><input id="username" type="text" placeholder="..."></div>
<div class="am-chips">
<div class="am-chip is-hit">id="username"</div>
<div class="am-chip is-hit">type="text"</div>
<div class="am-chip is-hit" id="r-placeholder">placeholder="Enter username"</div>
</div>
</div>
</div>
<div class="am-code"><span class="tok-var">input</span><span class="tok-punc">.</span><span class="tok-fn">removeAttribute</span><span class="tok-punc">(</span><span class="tok-str">"placeholder"</span><span class="tok-punc">);</span></div>
<button class="am-play" data-run="remove" type="button">run</button>
<p class="am-note">Gone completely โ not just emptied, the attribute itself no longer exists.</p>
</div>
<!-- hasAttribute -->
<div class="am-panel" data-panel="has">
<div class="am-page">
<div class="am-page-bar"><div class="am-page-dot"></div><div class="am-page-dot"></div><div class="am-page-dot"></div></div>
<div class="am-page-body">
<div class="am-input-mock"><input id="username" type="text"></div>
<div class="am-chips">
<div class="am-chip" id="h-id">id="username"</div>
<div class="am-chip" id="h-class">class โ not present</div>
</div>
</div>
</div>
<div class="am-code"><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">input</span><span class="tok-punc">.</span><span class="tok-fn">hasAttribute</span><span class="tok-punc">(</span><span class="tok-str">"id"</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">input</span><span class="tok-punc">.</span><span class="tok-fn">hasAttribute</span><span class="tok-punc">(</span><span class="tok-str">"class"</span><span class="tok-punc">));</span></div>
<div class="am-playrow">
<button class="am-play" data-run="has-id" type="button">check "id"</button>
<button class="am-play" data-run="has-class" type="button">check "class"</button>
</div>
<div class="am-console">
<span class="am-cline good" id="outHasId">true</span>
<span class="am-cline bad" id="outHasClass">false</span>
</div>
<p class="am-note">A quick yes/no โ no need to check if <strong>getAttribute()</strong> came back <strong>null</strong>.</p>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-attrmethods')
|| document.querySelector('.infographic-attrmethods');
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');
wrapper.querySelectorAll('.am-tab').forEach(tab => {
tab.addEventListener('click', () => {
wrapper.querySelectorAll('.am-tab').forEach(t => t.classList.remove('is-active'));
wrapper.querySelectorAll('.am-panel').forEach(p => p.classList.remove('is-active'));
tab.classList.add('is-active');
wrapper.querySelector('.am-panel[data-panel="' + tab.dataset.tab + '"]').classList.add('is-active');
});
});
/* getAttribute */
wrapper.querySelector('[data-run="get"]').addEventListener('click', () => {
const chip = wrapper.querySelector('#g-type');
const idChip = wrapper.querySelector('#g-id');
const out = wrapper.querySelector('#outGet');
chip.classList.remove('is-hit');
idChip.classList.remove('is-hit');
out.classList.remove('is-shown');
void chip.offsetWidth;
setTimeout(() => chip.classList.add('is-hit'), 80);
setTimeout(() => out.classList.add('is-shown'), 350);
});
/* setAttribute */
wrapper.querySelector('[data-run="set"]').addEventListener('click', () => {
const chip = wrapper.querySelector('#s-placeholder');
chip.classList.remove('is-shown');
void chip.offsetWidth;
setTimeout(() => chip.classList.add('is-shown'), 120);
});
/* removeAttribute */
wrapper.querySelector('[data-run="remove"]').addEventListener('click', () => {
const chip = wrapper.querySelector('#r-placeholder');
chip.classList.remove('is-removing', 'is-gone');
void chip.offsetWidth;
setTimeout(() => chip.classList.add('is-removing'), 100);
setTimeout(() => chip.classList.add('is-gone'), 500);
});
/* hasAttribute */
wrapper.querySelector('[data-run="has-id"]').addEventListener('click', () => {
const chip = wrapper.querySelector('#h-id');
const chipClass = wrapper.querySelector('#h-class');
const out = wrapper.querySelector('#outHasId');
const outClass = wrapper.querySelector('#outHasClass');
chip.classList.remove('is-true', 'is-false');
chipClass.classList.remove('is-true', 'is-false');
out.classList.remove('is-shown');
outClass.classList.remove('is-shown');
void chip.offsetWidth;
setTimeout(() => chip.classList.add('is-true'), 80);
setTimeout(() => out.classList.add('is-shown'), 300);
});
wrapper.querySelector('[data-run="has-class"]').addEventListener('click', () => {
const chip = wrapper.querySelector('#h-id');
const chipClass = wrapper.querySelector('#h-class');
const out = wrapper.querySelector('#outHasId');
const outClass = wrapper.querySelector('#outHasClass');
chip.classList.remove('is-true', 'is-false');
chipClass.classList.remove('is-true', 'is-false');
out.classList.remove('is-shown');
outClass.classList.remove('is-shown');
void chip.offsetWidth;
setTimeout(() => chipClass.classList.add('is-false'), 80);
setTimeout(() => outClass.classList.add('is-shown'), 300);
});
})();
</script>๐น Attribute vs Property (Quick Tip)
Attribute โ Defined in HTML
Property โ Exists on DOM object
Example
input.value = "Bhaskar";
console.log(input.getAttribute("value"));nullโ๏ธ value is a property, not an HTML attribute.
โ Summary Table
Method | Purpose |
|---|---|
| Read attribute value |
| Add or update attribute |
| Remove attribute |
| Check attribute exists |
๐ Key Note:
Use properties for dynamic values (value, checked),
use attributes for static HTML-related data (id, class, src).