Understanding the Return Value
Every time you call Elements.update(), it returns a results object — a detailed receipt showing exactly what happened for each element you tried to update.
Quick Start (30 Seconds)
const results = Elements.update({
loginBtn: { disabled: false },
errorPanel: { style: { display: 'none' } }
});
// Check if elements were found
if (!results.loginBtn.success) {
console.error('Login button not found!');
}
// Use the element reference for follow-up operations
if (results.loginBtn.success) {
results.loginBtn.element.focus();
}One call. One receipt. Know exactly what worked and what didn't.
What Is the Return Value?
When Elements.update() finishes processing all your element IDs, it returns an object that mirrors your input. Each key you passed in becomes a key in the results — with information about what happened for that element.
You pass in: You get back:
─────────────────────────────────────────────────────────
{ elementId: { updates } } → { elementId: { success, element, error } }Syntax
const results = Elements.update({
id1: { /* update object */ },
id2: { /* update object */ }
});
// Access per-element results
results.id1.success // boolean: was the element found and updated?
results.id1.element // HTMLElement | null: reference to the DOM element
results.id1.error // string | null: error message if not foundWhy Does This Exist?
When Updating Without Verification Is Fine
Many update calls don't need verification — you know the elements exist:
// Static page — elements always present, no need to check
Elements.update({
pageTitle: { textContent: 'Dashboard' }
});When Verification and Element Access Matter
In SPAs, dynamic UIs, A/B tests, or conditional rendering, elements may not always be in the DOM. The return value handles this gracefully:
const results = Elements.update({
checkoutForm: { style: { display: 'block' } },
cardInput: { disabled: false },
payBtn: { disabled: false }
});
const missing = Object.entries(results)
.filter(([, r]) => !r.success)
.map(([id]) => id);
if (missing.length > 0) {
console.error('Missing elements:', missing);
showSystemError('Checkout unavailable. Please refresh.');
return;
}This is especially useful when: ✅ Elements might be conditionally rendered or dynamically inserted ✅ You need to verify all required UI elements are present ✅ You want to use the element reference for follow-up operations ✅ You're building critical flows (checkout, authentication) ✅ You need to debug which elements are missing
The Choice Is Yours:
- Skip the return value when elements are guaranteed to exist
- Capture and check it for critical UI paths
- Use the
.elementreference for follow-up DOM work
Mental Model: The Delivery Receipt
Think of the return value as a delivery receipt:
You send updates to: Receipt shows:
────────────────────── ──────────────────────────────────
emailInput emailInput: ✅ Delivered (success: true)
passwordInput passwordInput: ✅ Delivered (success: true)
submitBtn submitBtn: ❌ Not found (success: false)
errorDisplay errorDisplay: ✅ Delivered (success: true)Every update either got delivered or the address wasn't found. You know exactly what happened.
How Does It Work?
Elements.update({ title: {...}, footer: {...} })
│
For "title": getElementById("title")
Found? → apply update → { success: true, element: <h1>, error: null }
Not found? → { success: false, element: null, error: 'Not found: title' }
│
For "footer": getElementById("footer")
Found? → apply update → { success: true, element: <footer>, error: null }
Not found? → { success: false, element: null, error: 'Not found: footer' }
│
Return:
{
title: { success: true, element: HTMLElement, error: null },
footer: { success: false, element: null, error: 'Not found: footer' }
}The Results Object in Detail
success — Boolean
results.elementId.success // true = found and updated; false = not foundelement — HTMLElement or null
results.elementId.element // Live HTMLElement when found; null when not foundWhen found, this is the actual DOM element — you can call methods, read properties, traverse children.
error — String or null
results.elementId.error // null on success; "Element not found: id" on failureUsage Patterns
Pattern 1: Check a Single Critical Element
const results = Elements.update({
saveBtn: { disabled: false, textContent: 'Save' }
});
if (!results.saveBtn.success) {
console.error('Save button missing — feature unavailable');
showFallback();
return;
}Pattern 2: Use the Element Reference for Follow-Up
const results = Elements.update({
notification: { textContent: 'Saved!', style: { display: 'flex' } }
});
if (results.notification.success) {
// Auto-dismiss after 3 seconds
setTimeout(() => {
results.notification.element.style.display = 'none';
}, 3000);
}Pattern 3: Verify All Elements Succeeded
const results = Elements.update({
emailInput: { value: '', disabled: false },
passwordInput: { value: '', disabled: false },
submitBtn: { disabled: false }
});
const allSucceeded = Object.values(results).every(r => r.success);
if (!allSucceeded) {
const missingIds = Object.entries(results)
.filter(([, r]) => !r.success)
.map(([id]) => id);
console.error('Missing form elements:', missingIds);
alert('Form failed to initialize. Please refresh.');
return;
}
// Safe to proceed
results.emailInput.element.focus();Pattern 4: Read Values from Element References
const results = Elements.update({
emailInput: { disabled: true, style: { opacity: '0.6' } },
passwordInput: { disabled: true, style: { opacity: '0.6' } }
});
if (results.emailInput.success && results.passwordInput.success) {
submitLogin({
email: results.emailInput.element.value,
password: results.passwordInput.element.value
});
}Pattern 5: Handle Partial Success Gracefully
const results = Elements.update({
primaryContent: { textContent: data.main },
secondaryContent: { textContent: data.secondary }, // Optional
sidebarWidget: { textContent: data.sidebar } // Optional
});
// Primary is critical
if (!results.primaryContent.success) {
throw new Error('Primary content area is missing');
}
// Others are optional
if (!results.secondaryContent.success) {
console.info('Secondary content section not present — skipping');
}Pattern 6: Log All Results for Debugging
const results = Elements.update({
header: { textContent: 'Dashboard' },
nav: { classList: { add: 'initialized' } },
content: { style: { opacity: '1' } }
});
Object.entries(results).forEach(([id, result]) => {
console.log(result.success ? `✅ Updated: ${id}` : `❌ Not found: ${id} — ${result.error}`);
});Real-World Example: Form Submission Flow
async function handleFormSubmission() {
// Step 1: Apply loading state
const initResults = Elements.update({
emailInput: { disabled: true, style: { opacity: '0.6' } },
passwordInput: { disabled: true, style: { opacity: '0.6' } },
submitBtn: { disabled: true, textContent: 'Signing in...' },
errorMessage: { style: { display: 'none' } }
});
// Step 2: Verify critical elements exist
const criticalIds = ['emailInput', 'passwordInput', 'submitBtn'];
const missing = criticalIds.filter(id => !initResults[id]?.success);
if (missing.length > 0) {
console.error('Form elements missing:', missing);
alert('Page error. Please refresh.');
return;
}
// Step 3: Read values from element references
const email = initResults.emailInput.element.value;
const password = initResults.passwordInput.element.value;
try {
await loginUser({ email, password });
Elements.update({
submitBtn: { textContent: 'Signed in!', style: { backgroundColor: '#16a34a' } }
});
redirectToDashboard();
} catch (error) {
Elements.update({
emailInput: { disabled: false, style: { opacity: '1' } },
passwordInput: { disabled: false, style: { opacity: '1' } },
submitBtn: { disabled: false, textContent: 'Try Again' },
errorMessage: {
textContent: error.message || 'Invalid credentials',
style: { display: 'block', color: '#dc2626' }
}
});
// Focus email field for correction (using saved reference)
initResults.emailInput.element.focus();
initResults.emailInput.element.select();
}
}When an Element Doesn't Exist
Missing elements are reported, not thrown:
const results = Elements.update({
realButton: { textContent: 'Click' }, // Exists
ghostElement: { textContent: 'Missing' } // Not in DOM
});
console.log(results);
// {
// realButton: { success: true, element: <button>, error: null },
// ghostElement: { success: false, element: null, error: "Not found: ghostElement" }
// }
// App continues normally — no exceptionComparing Return Values Across Methods
| Method | element reference | Count |
|---|---|---|
Elements.update() | element: HTMLElement | — (0 or 1 per ID) |
Collections.update() | collection: Collection | elementsUpdated: number |
Selector.update() | elements: Collection | elementsUpdated: number |
Elements.update() targets one element per ID — so you get back the single element, not a collection.
Best Practices
✅ DO: Check critical elements
const results = Elements.update({ criticalEl: { /* ... */ } });
if (!results.criticalEl.success) { handleMissing(); }✅ DO: Use element references for follow-up work
const results = Elements.update({ inputField: { value: 'pre-filled' } });
if (results.inputField.success) {
results.inputField.element.focus();
results.inputField.element.select();
}❌ DON'T: Confuse single vs bulk return types
// ❌ Single element update returns HTMLElement, not results object
const el = Elements.myButton.update({ disabled: true });
el.myButton.success; // TypeError — el is an HTMLElement
// ✅ Bulk form returns results object
const results = Elements.update({ myButton: { disabled: true } });
results.myButton.success; // Works!Quick Reference
const results = Elements.update({ id1: {...}, id2: {...} });
results.id1.success // Was it found?
results.id1.element // HTMLElement (or null)
results.id1.error // Error string (or null)
Object.values(results).every(r => r.success) // All succeeded?
Object.keys(results).filter(id => !results[id].success) // Which failed?Summary
The return value of Elements.update() is a results object mirroring your input:
success—trueif found and updated;falseif not foundelement— the HTMLElement when found;nullotherwiseerror— descriptive error string when not found;nullotherwise- Silent failures — missing elements are reported, never thrown
- Element references — use
.elementfor follow-up DOM work
The golden rule:
For optional elements, ignore the return value. For critical elements, always check it.
Congratulations!
You've completed the Elements.update() learning path:
✅ What Elements.update() is and why it exists ✅ The basic syntax and structure — step by step ✅ Targeting by ID — naming conventions and best practices ✅ Real-world patterns — forms, dashboards, modals, notifications ✅ Update object properties — all 8 property categories ✅ The return value — verification, element access, error handling
You're ready to use Elements.update() in production!
Next steps:
- Explore
Collections.update()for updating groups of similar elements - Check out
Selector.update()for complex CSS selector targeting