JavaScript Browser APIs
Use built-in browser capabilities to build powerful apps.
storagefetchgeolocationTable of Contents
JavaScript Browser APIs: A Complete Tutorial
Browser APIs are built-in interfaces that allow JavaScript to interact with the browser and device capabilities. They power networking, storage, media, offline support, performance monitoring, and more.
console.log(window);
console.log(navigator);
console.log(document);
async function example() {
const response = await fetch("/api/data");
return await response.json();
}| Category | Purpose | Examples |
|---|---|---|
| Communication | Network/data transfer | Fetch, WebSockets, Beacon |
| Storage | Persist local data | LocalStorage, IndexedDB, Cache API |
| DOM & Layout | Observe UI efficiently | Intersection/Resize/Mutation Observer |
| Offline & Background | Work off main thread | Web Workers, Service Workers |
| Device Access | Hardware features | Geolocation, MediaDevices |
| Performance | Measure and optimize | Performance API, Long Tasks |
2. Fetch API (Network Requests)
Basic GET
async function getUserData(userId) {
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) throw new Error(`HTTP error: ${response.status}`);
return await response.json();
} catch (error) {
console.error("Fetch failed:", error);
return null;
}
}POST with JSON
async function createPost(title, content) {
const response = await fetch("https://api.example.com/posts", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ title, content, createdAt: new Date().toISOString() })
});
if (!response.ok) throw new Error(`Failed: ${response.status}`);
return await response.json();
}AbortController Timeout
function fetchWithTimeout(url, timeout = 5000) {
const controller = new AbortController();
const id = setTimeout(() => controller.abort(), timeout);
return fetch(url, { signal: controller.signal })
.then(res => { clearTimeout(id); if (!res.ok) throw new Error(`HTTP ${res.status}`); return res.json(); })
.catch(err => { if (err.name === "AbortError") throw new Error("Request timed out"); throw err; });
}3. Storage APIs (Persisting Data)
LocalStorage and SessionStorage
localStorage.setItem("user", JSON.stringify({ name: "Alice", theme: "dark" }));
const user = JSON.parse(localStorage.getItem("user"));
sessionStorage.setItem("tempData", "clears when tab closes");IndexedDB with localForage
// localforage.config({ driver: localforage.INDEXEDDB, name: "MyAppDB" });
async function saveUserPreferences(userId, preferences) {
await localforage.setItem(`prefs_${userId}`, preferences);
}
async function loadUserPreferences(userId) {
return (await localforage.getItem(`prefs_${userId}`)) || { theme: "light" };
}Cache API
const cache = await caches.open("my-cache-v1");
await cache.addAll(["/styles/main.css", "/script.js"]);
const response = await cache.match("/styles/main.css");4. DOM Observer APIs
Intersection Observer
const imageObserver = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
observer.unobserve(img);
}
});
}, { rootMargin: "50px", threshold: 0.1 });Resize Observer
const resizeObserver = new ResizeObserver(entries => {
for (const entry of entries) {
const { width } = entry.contentRect;
entry.target.classList.toggle("compact-view", width < 400);
}
});Mutation Observer
const observer = new MutationObserver(mutations => {
mutations.forEach(m => console.log("Mutation type:", m.type));
});
observer.observe(document.getElementById("comments-container"), { childList: true, subtree: true });5. Geolocation API
if ("geolocation" in navigator) {
navigator.geolocation.getCurrentPosition(
pos => console.log(pos.coords.latitude, pos.coords.longitude),
err => console.error(err.message),
{ enableHighAccuracy: true, timeout: 10000, maximumAge: 60000 }
);
}Use watchPosition() for continuous tracking and clear it with clearWatch().
6. Web Workers (Background Processing)
// main.js
const worker = new Worker("worker.js");
worker.postMessage({ numbers: [1, 2, 3, 4, 5] });
worker.onmessage = e => console.log("Worker result:", e.data);
// worker.js
self.onmessage = e => {
const sum = e.data.numbers.reduce((a, b) => a + b, 0);
self.postMessage({ sum });
};Workers cannot access the DOM directly, which keeps UI thread free for interactions.
7. Service Workers and PWA APIs
// main
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js");
}
// sw.js
self.addEventListener("install", event => {
event.waitUntil(caches.open("app-v1").then(cache => cache.addAll(["/", "/offline.html"])));
});
self.addEventListener("fetch", event => {
event.respondWith(caches.match(event.request).then(r => r || fetch(event.request)));
});Use Push API and Background Sync for advanced offline and re-engagement workflows.
9. User Interaction APIs
Dialog API
const dialog = document.getElementById("my-dialog");
dialog.showModal();
dialog.addEventListener("close", () => console.log(dialog.returnValue));Page Visibility + Notifications
document.addEventListener("visibilitychange", () => {
if (document.hidden) pauseNonCriticalWork();
else resumeWork();
});
const permission = await Notification.requestPermission();10. Media and Device APIs
MediaDevices / Camera
const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
document.getElementById("camera-preview").srcObject = stream;MediaRecorder + Screen Capture
const displayStream = await navigator.mediaDevices.getDisplayMedia({ video: true });
const recorder = new MediaRecorder(displayStream);
recorder.start(1000);Web Audio
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
const oscillator = audioContext.createOscillator();
oscillator.connect(audioContext.destination);
oscillator.start();11. Performance APIs
const lcpObserver = new PerformanceObserver(list => {
const entries = list.getEntries();
console.log("LCP:", entries[entries.length - 1]?.startTime);
});
lcpObserver.observe({ type: "largest-contentful-paint", buffered: true });
const longTaskObserver = new PerformanceObserver(list => {
for (const e of list.getEntries()) console.warn(`Long task: ${e.duration}ms`);
});
longTaskObserver.observe({ type: "longtask", buffered: true });requestAnimationFrame is essential for smooth animation loops. Use navigator.sendBeacon() for reliable analytics on page exit.
12. Modern and Cutting-Edge APIs
View Transitions API
if (document.startViewTransition) {
await document.startViewTransition(() => {
document.getElementById("main").innerHTML = "New Content
";
}).finished;
}BroadcastChannel + Web Locks + File System + Web Share
const channel = new BroadcastChannel("app-state");
channel.postMessage({ type: "STATE_UPDATE" });
await navigator.locks?.request("resource-1", async () => syncData());
if (window.showOpenFilePicker) {
const [fileHandle] = await window.showOpenFilePicker();
const file = await fileHandle.getFile();
}
if (navigator.share) {
await navigator.share({ title: "Check this", url: location.href });
}Quick Reference: Browser APIs by Use Case
| Use Case | Best API |
|---|---|
| Network requests | Fetch API |
| Store user data | IndexedDB/localForage |
| Cache network responses | Cache API + Service Worker |
| Lazy loading | Intersection Observer |
| Heavy calculations | Web Workers |
| Offline support | Service Workers |
| Send analytics on exit | Beacon API |
| Smooth animation | requestAnimationFrame |
| Cross-tab sync | BroadcastChannel |
| Camera/Mic access | MediaDevices API |
| File read/write | File System Access API |
| Native share | Web Share API |
Start with Fetch, Storage, and Observer APIs. Progressively enhance with modern APIs and always include feature detection plus graceful fallbacks.
Related Topics
Combine this with Asynchronous JavaScript, Performance Optimization, and Projects for production-ready browser applications.