DEV Community

KAMAL KISHOR
KAMAL KISHOR

Posted on

🕵️‍♂️ 50 Hidden Browser Events & APIs (with Code Examples)

Most developers stick to the usual suspects: click, input, keydown. But the browser hides a treasure chest of lesser-known events and APIs that give you superpowers for building advanced web apps.

In this post, I’ll show you 50 hidden gems, grouped by category, with examples and real-world use cases.

🔄 Page Lifecycle & Navigation

1. beforeunload

window.addEventListener("beforeunload", (e) => {
  e.preventDefault();
  e.returnValue = "";
  console.log("Page is closing or reloading");
});
Enter fullscreen mode Exit fullscreen mode

2. pagehide

window.addEventListener("pagehide", () => {
  console.log("Page hidden or unloaded");
});
Enter fullscreen mode Exit fullscreen mode

3. pageshow

window.addEventListener("pageshow", (e) => {
  console.log("Page shown again", e.persisted ? "From cache" : "Fresh load");
});
Enter fullscreen mode Exit fullscreen mode

4. visibilitychange

document.addEventListener("visibilitychange", () => {
  console.log("Visibility:", document.visibilityState);
});
Enter fullscreen mode Exit fullscreen mode

5. freeze / resume

document.addEventListener("freeze", () => console.log("Page frozen"));
document.addEventListener("resume", () => console.log("Page resumed"));
Enter fullscreen mode Exit fullscreen mode

6. popstate

window.addEventListener("popstate", (e) => {
  console.log("Navigated back/forward", e.state);
});
Enter fullscreen mode Exit fullscreen mode

7. hashchange

window.addEventListener("hashchange", () => {
  console.log("New hash:", location.hash);
});
Enter fullscreen mode Exit fullscreen mode

8. DOMContentLoaded

document.addEventListener("DOMContentLoaded", () => {
  console.log("DOM fully parsed");
});
Enter fullscreen mode Exit fullscreen mode

9. load

window.addEventListener("load", () => {
  console.log("All resources loaded");
});
Enter fullscreen mode Exit fullscreen mode

10. unhandledrejection

window.addEventListener("unhandledrejection", (e) => {
  console.error("Unhandled promise:", e.reason);
});
Enter fullscreen mode Exit fullscreen mode

🖥️ Window & Document Events

11. resize

window.addEventListener("resize", () => {
  console.log("Window size:", window.innerWidth, window.innerHeight);
});
Enter fullscreen mode Exit fullscreen mode

12. scrollend

document.addEventListener("scrollend", () => {
  console.log("Scrolling finished");
});
Enter fullscreen mode Exit fullscreen mode

13. fullscreenchange

document.addEventListener("fullscreenchange", () => {
  console.log("Fullscreen:", !!document.fullscreenElement);
});
Enter fullscreen mode Exit fullscreen mode

14. deviceorientation

window.addEventListener("deviceorientation", (e) => {
  console.log("Orientation:", e.alpha, e.beta, e.gamma);
});
Enter fullscreen mode Exit fullscreen mode

15. devicemotion

window.addEventListener("devicemotion", (e) => {
  console.log("Acceleration:", e.acceleration);
});
Enter fullscreen mode Exit fullscreen mode

16. orientationchange

window.addEventListener("orientationchange", () => {
  console.log("Orientation changed:", screen.orientation.type);
});
Enter fullscreen mode Exit fullscreen mode

17. storage

window.addEventListener("storage", (e) => {
  console.log("Storage change:", e.key, e.newValue);
});
Enter fullscreen mode Exit fullscreen mode

18. beforeprint / afterprint

window.addEventListener("beforeprint", () => console.log("Before print"));
window.addEventListener("afterprint", () => console.log("After print"));
Enter fullscreen mode Exit fullscreen mode

19. copy / cut / paste

document.addEventListener("copy", () => console.log("Copied!"));
document.addEventListener("paste", (e) => {
  console.log("Pasted:", e.clipboardData.getData("text"));
});
Enter fullscreen mode Exit fullscreen mode

20. selectionchange

document.addEventListener("selectionchange", () => {
  console.log("Selected text:", document.getSelection().toString());
});
Enter fullscreen mode Exit fullscreen mode

🖱️ Input/Pointer & UX

21. contextmenu

document.addEventListener("contextmenu", (e) => {
  e.preventDefault();
  console.log("Right-click blocked");
});
Enter fullscreen mode Exit fullscreen mode

22. auxclick

document.addEventListener("auxclick", (e) => {
  console.log("Aux click:", e.button);
});
Enter fullscreen mode Exit fullscreen mode

23. pointerlockchange

document.addEventListener("pointerlockchange", () => {
  console.log("Pointer lock:", document.pointerLockElement);
});
Enter fullscreen mode Exit fullscreen mode

24. pointerrawupdate

document.addEventListener("pointerrawupdate", (e) => {
  console.log("Raw move:", e.movementX, e.movementY);
});
Enter fullscreen mode Exit fullscreen mode

25. wheel

window.addEventListener("wheel", (e) => {
  console.log("Wheel delta:", e.deltaY);
});
Enter fullscreen mode Exit fullscreen mode

26. dblclick

document.addEventListener("dblclick", () => {
  console.log("Double clicked!");
});
Enter fullscreen mode Exit fullscreen mode

27. mouseenter / mouseleave

box.addEventListener("mouseenter", () => console.log("Mouse entered box"));
box.addEventListener("mouseleave", () => console.log("Mouse left box"));
Enter fullscreen mode Exit fullscreen mode

28. focusin / focusout

document.addEventListener("focusin", () => console.log("Focus in"));
document.addEventListener("focusout", () => console.log("Focus out"));
Enter fullscreen mode Exit fullscreen mode

29. dragstart / dragend / drop

box.addEventListener("dragstart", () => console.log("Dragging started"));
dropzone.addEventListener("drop", () => console.log("Dropped!"));
Enter fullscreen mode Exit fullscreen mode

30. input with inputType

document.querySelector("input").addEventListener("input", (e) => {
  console.log("Input type:", e.inputType, "Value:", e.target.value);
});
Enter fullscreen mode Exit fullscreen mode

📡 Network & Connectivity

31. online / offline

window.addEventListener("online", () => console.log("Back online"));
window.addEventListener("offline", () => console.log("Offline mode"));
Enter fullscreen mode Exit fullscreen mode

32. Service Worker fetch

self.addEventListener("fetch", (e) => {
  console.log("Intercepted:", e.request.url);
});
Enter fullscreen mode Exit fullscreen mode

33. Service Worker push

self.addEventListener("push", (e) => {
  console.log("Push message:", e.data.text());
});
Enter fullscreen mode Exit fullscreen mode

34. beforeinstallprompt

window.addEventListener("beforeinstallprompt", (e) => {
  e.preventDefault();
  console.log("PWA install available");
});
Enter fullscreen mode Exit fullscreen mode

35. appinstalled

window.addEventListener("appinstalled", () => {
  console.log("PWA installed");
});
Enter fullscreen mode Exit fullscreen mode

36. connectionchange

navigator.connection.addEventListener("change", () => {
  console.log("Network:", navigator.connection.effectiveType);
});
Enter fullscreen mode Exit fullscreen mode

37. WebSocket onclose

socket.onclose = () => console.log("WebSocket closed");
Enter fullscreen mode Exit fullscreen mode

38. WebSocket onerror

socket.onerror = (e) => console.log("WebSocket error", e);
Enter fullscreen mode Exit fullscreen mode

39. Service Worker backgroundfetchsuccess

self.addEventListener("backgroundfetchsuccess", (e) => {
  console.log("Background fetch done", e.registration.id);
});
Enter fullscreen mode Exit fullscreen mode

40. navigator.sendBeacon

navigator.sendBeacon("/log", JSON.stringify({ event: "exit" }));
Enter fullscreen mode Exit fullscreen mode

🎙️ Media & Device APIs

41. canplay

video.addEventListener("canplay", () => console.log("Media can play"));
Enter fullscreen mode Exit fullscreen mode

42. canplaythrough

video.addEventListener("canplaythrough", () => console.log("Buffer enough to play through"));
Enter fullscreen mode Exit fullscreen mode

43. ended

video.addEventListener("ended", () => console.log("Video ended"));
Enter fullscreen mode Exit fullscreen mode

44. timeupdate

video.addEventListener("timeupdate", () => console.log("Current time:", video.currentTime));
Enter fullscreen mode Exit fullscreen mode

45. waiting

video.addEventListener("waiting", () => console.log("Buffering..."));
Enter fullscreen mode Exit fullscreen mode

46. speechstart / speechend

recognition.addEventListener("speechstart", () => console.log("Speech started"));
recognition.addEventListener("speechend", () => console.log("Speech ended"));
Enter fullscreen mode Exit fullscreen mode

47. voiceschanged

speechSynthesis.onvoiceschanged = () => {
  console.log("Voices available:", speechSynthesis.getVoices());
};
Enter fullscreen mode Exit fullscreen mode

48. gamepadconnected

window.addEventListener("gamepadconnected", (e) => {
  console.log("Gamepad:", e.gamepad.id);
});
Enter fullscreen mode Exit fullscreen mode

49. gamepaddisconnected

window.addEventListener("gamepaddisconnected", (e) => {
  console.log("Gamepad removed:", e.gamepad.id);
});
Enter fullscreen mode Exit fullscreen mode

50. bluetoothavailabilitychanged

navigator.bluetooth.addEventListener("availabilitychanged", (e) => {
  console.log("Bluetooth available:", e.value);
});
Enter fullscreen mode Exit fullscreen mode

🎯 Wrapping Up

Most devs never use these — but mastering hidden events & APIs lets you:

Build offline-ready PWAs

Handle back/forward cache properly

Capture system/device events (gamepad, Bluetooth, sensors)

Improve UX with clipboard, printing, fullscreen, orientation

👉 Bookmark this as your cheat sheet of browser superpowers.

🎮 Try It Live!

👉 See the Pen 50 Hidden Gems JS

by Kamal Kishor (@koolkamalkishor) on CodePen.

Top comments (0)