Docs
README
Module 19: Advanced DOM & Browser APIs
Master advanced DOM manipulation techniques and modern browser APIs for building rich, performant web applications.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β ADVANCED DOM & BROWSER APIS β β
β β β β
β β "Beyond the Basics - Professional Web Development" β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β OBSERVE β β TRAVERSE β β MEASURE β β
β β ββββββββ β β ββββββββ β β ββββββββ β β
β β Mutation β β TreeWalker β β Performance β β
β β Intersectionβ β NodeIteratorβ β Timing β β
β β Resize β β Range/Selectβ β Metrics β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π Module Overview
This module takes you beyond basic DOM manipulation into the realm of professional-grade browser APIs. You'll learn to efficiently observe changes, traverse complex document structures, and measure performance with precision.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β WHY ADVANCED DOM APIs? β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Traditional Approach: Modern Observer Pattern: β
β βββββββββββββββββββββ ββββββββββββββββββββββββ β
β β
β setInterval(() => { const observer = new β
β checkForChanges(); VS IntersectionObserver(callback); β
β }, 100); observer.observe(element); β
β β
β β Wasteful polling β
Event-driven efficiency β
β β Missed changes β
Guaranteed detection β
β β Battery drain β
Browser-optimized β
β β Performance hit β
Async, non-blocking β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π Sections
19.1 Advanced DOM Traversal
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DOM TRAVERSAL EVOLUTION β
β β
β Basic: Intermediate: Advanced: β
β βββββββ βββββββββββββ βββββββββ β
β querySelector() β querySelectorAll() β TreeWalker β
β getElementById() β getElementsBy* β NodeIterator β
β parentNode β children β Range API β
β firstChild β closest() β Selection API β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- β’TreeWalker - Flexible DOM tree navigation with custom filters
- β’NodeIterator - Sequential node traversal with filtering
- β’Range and Selection APIs - Programmatic text selection and manipulation
- β’Shadow DOM basics - Understanding encapsulated DOM structures
19.2 Mutation Observer
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MUTATION OBSERVER β
β β
β DOM Change Event β
β β β
β βΌ β
β ββββββββββββββββ β
β β Browser ββββββββΊ Batches Changes β
β β Engine β β β
β ββββββββββββββββ βΌ β
β ββββββββββββββββ β
β β Mutation β β
β β Records β β
β ββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββ β
β β Callback ββββββββΊ Your Code β
β β (async) β β
β ββββββββββββββββ β
β β
β Observes: childList | attributes | characterData | subtree β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- β’Observing DOM changes - React to any DOM modification
- β’Configuration options - Fine-tune what to observe
- β’Performance considerations - Avoiding callback storms
- β’Practical use cases - WYSIWYG editors, third-party script monitoring
19.3 Intersection Observer
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β INTERSECTION OBSERVER β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β VIEWPORT β β
β β β β
β β βββββββββββ β β
β β β Element β ββββ isIntersecting: true β β
β β βββββββββββ intersectionRatio: 0.75 β β
β β β β
β β- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - β β
β β threshold: [0, 0.25, 0.5, 0.75, 1] β β
β β rootMargin: "100px 0px" β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β βββββββββββ β
β β β Element β ββββ isIntersecting: false (below viewport) β
β β βββββββββββ β
β β
β Use Cases: Lazy Loading β’ Infinite Scroll β’ Analytics β’ Animations β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- β’Lazy loading images - Load content only when needed
- β’Infinite scroll - Dynamically load more content
- β’Analytics tracking - Track element visibility
- β’Animation triggers - Start animations on scroll
19.4 Resize Observer
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β RESIZE OBSERVER β
β β
β ββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββ β
β β β β β β
β β Container Resizes β βββΊ β Element Resizes β β
β β β β β β
β ββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββββ β
β β ResizeObserver β β
β β Callback Fires β β
β ββββββββββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββββ β
β β contentRect: β β
β β width, height β β
β β top, left β β
β ββββββββββββββββββββββββ β
β β
β Use Cases: Responsive Charts β’ Container Queries β’ Flexible Layouts β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- β’Element resize detection - Know when any element changes size
- β’Responsive components - Build truly responsive widgets
- β’Performance optimization - Efficient resize handling
19.5 Performance Observer & APIs
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PERFORMANCE MEASUREMENT β
β β
β Timeline: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β navigationStart loadEventβ β
β β β β β β
β β βΌ βΌ β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β β β β β β β β
β β redirect fetch connect request response DOM load completeβ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β APIs: β
β ββββββββββββββββββ ββββββββββββββββββ ββββββββββββββββββ β
β β performance β β Performance β β Resource β β
β β .now() β β .mark() β β Timing β β
β β .measure() β β .getEntries() β β Navigation β β
β ββββββββββββββββββ ββββββββββββββββββ ββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- β’Performance.now() - High-resolution timestamps
- β’Performance marks and measures - Custom timing metrics
- β’Navigation timing - Page load performance
- β’Resource timing - Individual resource load times
π― Learning Objectives
By the end of this module, you will:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SKILL PROGRESSION β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Level 1: Understanding β
β βββ Explain the Observer pattern and its benefits β
β βββ Understand when to use each Observer API β
β βββ Know the performance implications of DOM operations β
β β
β Level 2: Implementation β
β βββ Implement lazy loading with IntersectionObserver β
β βββ Track DOM changes with MutationObserver β
β βββ Build responsive components with ResizeObserver β
β βββ Create custom performance metrics β
β β
β Level 3: Optimization β
β βββ Optimize observer callbacks for performance β
β βββ Properly disconnect observers to prevent leaks β
β βββ Combine multiple observers efficiently β
β β
β Level 4: Mastery β
β βββ Build production-grade lazy loading systems β
β βββ Create real-time performance monitoring dashboards β
β βββ Implement complex infinite scroll with virtual scrolling β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π Prerequisites
- β’Module 17: DOM Manipulation - Basic DOM concepts
- β’Module 15 & 16: Async JavaScript - Understanding callbacks and async patterns
- β’Understanding of browser event loop - How the browser schedules work
π Key Concepts
The Observer Pattern in Browsers
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β BROWSER OBSERVER PATTERN β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ β
β βMutationObserver β βIntersectionObs. β β ResizeObserver β β
β βββββββββββββββββββ€ βββββββββββββββββββ€ βββββββββββββββββββ€ β
β β WHAT: DOM tree β β WHAT: Viewport β β WHAT: Element β β
β β changes β β crossing β β size β β
β βββββββββββββββββββ€ βββββββββββββββββββ€ βββββββββββββββββββ€ β
β β WHEN: childList β β WHEN: scroll, β β WHEN: resize, β β
β β attr, charData β β resize, layout β β layout change β β
β βββββββββββββββββββ€ βββββββββββββββββββ€ βββββββββββββββββββ€ β
β β WHY: React to β β WHY: Lazy load, β β WHY: Responsive β β
β β DOM mutations β β infinite scrl β β components β β
β βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ β
β β
β βββββββββββββββββββ βββββββββββββββββββ β
β βPerformanceObs. β β ReportingObs. β β
β βββββββββββββββββββ€ βββββββββββββββββββ€ β
β β WHAT: Perf β β WHAT: Browser β β
β β entries β β reports β β
β βββββββββββββββββββ€ βββββββββββββββββββ€ β
β β WHEN: Timing β β WHEN: CSP, dep. β β
β β marks, navs β β crashes, etc β β
β βββββββββββββββββββ€ βββββββββββββββββββ€ β
β β WHY: Measure & β β WHY: Error & β β
β β optimize β β security mon. β β
β βββββββββββββββββββ βββββββββββββββββββ β
β β
β Common Benefits: β
β β
No polling required β
Browser-optimized callbacks β
β β
Async execution β
Batched updates β
β β
Memory efficient β
Proper cleanup with disconnect() β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Observer API Comparison
ββββββββββββββββββββ¬ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββ
β Observer β What It Observes β Key Configuration β
ββββββββββββββββββββΌββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββ€
β Mutation β DOM tree changes β childList, attributes, subtree β
β Intersection β Element visibility β threshold, rootMargin, root β
β Resize β Element dimensions β box (content-box, border-box) β
β Performance β Performance entries β entryTypes, buffered β
β Reporting β Browser reports β types (deprecation, csp, crash) β
ββββββββββββββββββββ΄ββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββ
π‘ Common Patterns
Pattern 1: Basic Observer Setup
// All observers follow this pattern:
const observer = new SomeObserver(callback, options);
observer.observe(target);
// ... later
observer.disconnect();
Pattern 2: Lazy Loading Images
const lazyLoad = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
lazyLoad.unobserve(img);
}
});
});
document
.querySelectorAll('img[data-src]')
.forEach((img) => lazyLoad.observe(img));
Pattern 3: Infinite Scroll
const sentinel = document.querySelector('#load-more-sentinel');
const infiniteScroll = new IntersectionObserver(
(entries) => {
if (entries[0].isIntersecting) {
loadMoreContent();
}
},
{ rootMargin: '100px' }
);
infiniteScroll.observe(sentinel);
π― Practical Applications
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β REAL-WORLD USE CASES β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β MutationObserver: β
β βββ WYSIWYG editor undo/redo β
β βββ Third-party script injection detection β
β βββ Dynamic content accessibility β
β βββ Form validation on dynamic inputs β
β β
β IntersectionObserver: β
β βββ Image/video lazy loading β
β βββ Infinite scroll pagination β
β βββ Scroll-triggered animations β
β βββ Ad viewability tracking β
β βββ Read progress indicators β
β β
β ResizeObserver: β
β βββ Responsive data visualization β
β βββ Container query polyfills β
β βββ Textarea auto-resize β
β βββ Responsive image switching β
β β
β Performance APIs: β
β βββ Real user monitoring (RUM) β
β βββ Custom performance dashboards β
β βββ A/B test performance comparison β
β βββ Web vitals tracking β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β οΈ Common Pitfalls & Best Practices
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PITFALLS TO AVOID β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β β Memory Leaks β
Always Disconnect β
β βββββββββββββββββ ββββββββββββββββββββ β
β // Forgot to disconnect // Clean up properly β
β observer.observe(el); observer.observe(el); β
β // Element removed, leak! // When done: β
β observer.disconnect(); β
β β
β β Callback Storms β
Debounce/Throttle β
β βββββββββββββββββ βββββββββββββββββββ β
β // Every tiny change // Batch processing β
β callback: (mutations) => { callback: (mutations) => { β
β expensiveOperation(); requestAnimationFrame(() => β
β } batchedOperation(mutations) β
β ); β
β } β
β β
β β Over-Observing β
Precise Configuration β
β βββββββββββββββββ ββββββββββββββββββββββββ β
β { subtree: true, { subtree: false, // Only direct β
β attributes: true, attributeFilter: ['class'], β
β characterData: true } childList: true } β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π Section Files
| Section | Topic | Key Files |
|---|---|---|
| 19.1 | Advanced DOM Traversal | 01-tree-walker.js, 02-node-iterator.js, 03-range-api.js |
| 19.2 | Mutation Observer | 01-basic-mutation.js, 02-attribute-observer.js |
| 19.3 | Intersection Observer | 01-lazy-loading.js, 02-infinite-scroll.js |
| 19.4 | Resize Observer | 01-responsive-component.js, 02-chart-resize.js |
| 19.5 | Performance APIs | 01-performance-marks.js, 02-timing-api.js |
π Related Modules
- β’Previous: Module 18 - Browser APIs and Storage
- β’Next: Module 20 - Testing and Debugging
- β’Related: Module 23 - Performance Optimization
π Quick Reference Card
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β OBSERVER QUICK REFERENCE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β // MutationObserver β
β const mo = new MutationObserver(callback); β
β mo.observe(node, { childList: true, subtree: true }); β
β mo.disconnect(); β
β β
β // IntersectionObserver β
β const io = new IntersectionObserver(callback, { threshold: 0.5 }); β
β io.observe(element); β
β io.unobserve(element); β
β io.disconnect(); β
β β
β // ResizeObserver β
β const ro = new ResizeObserver(callback); β
β ro.observe(element); β
β ro.unobserve(element); β
β ro.disconnect(); β
β β
β // PerformanceObserver β
β const po = new PerformanceObserver(callback); β
β po.observe({ entryTypes: ['measure', 'mark'] }); β
β po.disconnect(); β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ