JavaScript Browser APIs

Use built-in browser capabilities to build powerful apps.

storagefetchgeolocation

Table 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();
}
CategoryPurposeExamples
CommunicationNetwork/data transferFetch, WebSockets, Beacon
StoragePersist local dataLocalStorage, IndexedDB, Cache API
DOM & LayoutObserve UI efficientlyIntersection/Resize/Mutation Observer
Offline & BackgroundWork off main threadWeb Workers, Service Workers
Device AccessHardware featuresGeolocation, MediaDevices
PerformanceMeasure and optimizePerformance 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 CaseBest API
Network requestsFetch API
Store user dataIndexedDB/localForage
Cache network responsesCache API + Service Worker
Lazy loadingIntersection Observer
Heavy calculationsWeb Workers
Offline supportService Workers
Send analytics on exitBeacon API
Smooth animationrequestAnimationFrame
Cross-tab syncBroadcastChannel
Camera/Mic accessMediaDevices API
File read/writeFile System Access API
Native shareWeb 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.

10 Browser APIs Interview Q&A

10 Browser APIs MCQs