JavaScript Cheatsheet

DOM

Use this JavaScript reference while you build software engineering projects, review code for technical interview prep, or polish examples for a software engineer resume.

Selecting Elements

// Single element — returns Element or null
document.getElementById("main")
document.querySelector(".card")          // first match, any CSS selector
document.querySelector("#nav > a.active")

// Multiple elements — returns NodeList (not a live array)
document.querySelectorAll(".item")       // NodeList — iterable but not Array
document.querySelectorAll("li, dt")      // multiple selectors

// Convert NodeList to Array for full array methods
Array.from(document.querySelectorAll(".item"))
[...document.querySelectorAll(".item")]

// Legacy methods
document.getElementsByTagName("div")    // HTMLCollection (live)
document.getElementsByClassName("card") // HTMLCollection (live)
document.getElementsByName("email")     // NodeList

// Relative to an element
el.querySelector(".child")
el.querySelectorAll("td")
el.closest(".container")     // nearest ancestor matching selector (walks up)
el.matches(".active")        // boolean — does el match this selector?

Traversing the DOM

// Parent
el.parentElement          // parent Element (or null)
el.parentNode             // parent Node (can be document, etc.)

// Children
el.children               // HTMLCollection of child Elements only
el.childNodes             // NodeList of all child nodes (incl. text)
el.firstElementChild      // first child Element
el.lastElementChild       // last child Element
el.firstChild             // first node (may be text node)
el.lastChild              // last node (may be text node)
el.childElementCount      // number of child elements

// Siblings
el.nextElementSibling     // next sibling Element
el.previousElementSibling // previous sibling Element
el.nextSibling            // next node (may be text)
el.previousSibling        // previous node (may be text)

// All descendants as array
[...el.querySelectorAll("*")]

// Contains
el.contains(otherEl)      // true if otherEl is el or a descendant
el.compareDocumentPosition(other) // bitmask: node relationship

Creating and Inserting Elements

// Create
const div = document.createElement("div");
const text = document.createTextNode("Hello");
const frag = document.createDocumentFragment(); // lightweight container, no reflow

// Set content before inserting (avoid repeated reflows)
div.textContent = "Hello";       // sets text (safe — no XSS)
div.innerHTML = "<b>Hello</b>";  // sets HTML (XSS risk with user data!)
div.className = "card active";
div.id = "main";

// Append / Prepend (modern — accepts strings and nodes)
parent.append(div);              // add at end
parent.prepend(div);             // add at start
parent.append("text", div, other); // multiple
el.before(newEl);                // insert before el
el.after(newEl);                 // insert after el

// Insert relative to element
el.insertAdjacentElement("beforebegin", newEl) // before el
el.insertAdjacentElement("afterbegin", newEl)  // first child of el
el.insertAdjacentElement("beforeend", newEl)   // last child of el
el.insertAdjacentElement("afterend", newEl)    // after el

el.insertAdjacentHTML("beforeend", "<li>Item</li>") // insert HTML
el.insertAdjacentText("afterend", "text")           // insert text

// Legacy
parent.appendChild(child)        // add at end — returns child
parent.insertBefore(newEl, refEl) // insert before refEl

// Clone
el.cloneNode(false)  // shallow — element only
el.cloneNode(true)   // deep — element + all descendants

Removing and Replacing

el.remove()                     // remove el from DOM (modern)
parent.removeChild(el)          // legacy — requires parent reference

el.replaceWith(newEl)           // replace el with newEl (or string)
parent.replaceChild(newEl, oldEl) // legacy

el.innerHTML = ""               // remove all children (fast but loses event listeners)
el.replaceChildren()            // clear children (or pass new children)
while (el.firstChild) el.removeChild(el.firstChild); // safe clear

Attributes

el.getAttribute("href")          // get attribute value (or null)
el.setAttribute("href", "/")     // set attribute
el.removeAttribute("disabled")   // remove attribute
el.hasAttribute("disabled")      // boolean check
el.toggleAttribute("disabled")   // toggle on/off
el.toggleAttribute("disabled", true)  // force on

// Data attributes
el.dataset.userId                // reads data-user-id attribute
el.dataset.userId = "123"        // sets data-user-id="123"
el.dataset.myKey = "val"         // sets data-my-key="val"
// <div data-user-id="1" data-my-key="val">

// Properties vs attributes
input.value       // property — current value
input.getAttribute("value") // attribute — initial/default value
input.checked     // boolean property
input.disabled    // boolean property

CSS Classes and Styles

// classList — preferred
el.classList.add("active", "visible")
el.classList.remove("hidden")
el.classList.toggle("open")
el.classList.toggle("open", condition) // force on/off
el.classList.replace("old", "new")
el.classList.contains("active")   // boolean
el.classList.item(0)              // class at index
[...el.classList]                 // array of class names
el.className = "card active"      // overwrite all classes (string)

// Inline styles
el.style.color = "red"
el.style.backgroundColor = "blue"  // camelCase for hyphenated
el.style.cssText = "color: red; background: blue;"  // batch
el.style.setProperty("--my-var", "42px") // CSS custom property
el.style.getPropertyValue("--my-var")
el.style.removeProperty("color")

// Computed styles (after CSS applied)
const styles = window.getComputedStyle(el)
styles.getPropertyValue("color")  // "rgb(255, 0, 0)"
styles.fontSize                   // "16px"

Events

addEventListener

// addEventListener(type, handler, options)
el.addEventListener("click", handler)
el.addEventListener("click", handler, { capture: true })
el.addEventListener("click", handler, { once: true })     // auto-removes after first call
el.addEventListener("click", handler, { passive: true })  // hints browser: no preventDefault
el.addEventListener("click", handler, { signal: controller.signal }) // abortable

el.removeEventListener("click", handler) // must pass same function reference

// Abort-based removal (ES2022)
const ac = new AbortController();
el.addEventListener("click", handler, { signal: ac.signal });
ac.abort(); // removes listener

Event Object

el.addEventListener("click", (event) => {
  event.type            // "click"
  event.target          // element that triggered event
  event.currentTarget   // element listener is on
  event.bubbles         // true if event bubbles
  event.cancelable      // true if default can be prevented

  event.preventDefault()    // stop default behavior (form submit, link follow)
  event.stopPropagation()   // stop bubbling/capturing
  event.stopImmediatePropagation() // stop other listeners on same element too

  // Mouse events
  event.clientX / event.clientY   // viewport-relative
  event.pageX / event.pageY       // document-relative
  event.offsetX / event.offsetY   // element-relative
  event.button    // 0=left, 1=middle, 2=right
  event.buttons   // bitmask of pressed buttons
  event.altKey / event.ctrlKey / event.shiftKey / event.metaKey

  // Keyboard events
  event.key       // "Enter", "ArrowUp", "a", etc.
  event.code      // "KeyA", "ArrowUp", "Enter" (physical key)
  event.repeat    // true if key held down

  // Touch events
  event.touches        // list of all current touches
  event.changedTouches // touches that changed
});

Common Events

// Mouse
"click"         // left click or Enter on focused
"dblclick"
"mousedown" / "mouseup"
"mousemove"
"mouseenter"    // does not bubble
"mouseleave"    // does not bubble
"mouseover"     // bubbles — fires on children too
"mouseout"      // bubbles
"contextmenu"   // right-click

// Keyboard
"keydown"       // fires repeatedly when held
"keyup"
"keypress"      // deprecated — use keydown

// Form
"submit"        // form submission
"change"        // input value committed (blur or Enter)
"input"         // any value change (fires on every keystroke)
"focus"         // element gains focus (does not bubble)
"blur"          // element loses focus (does not bubble)
"focusin"       // gains focus (bubbles)
"focusout"      // loses focus (bubbles)
"reset"

// Document / Window
"load"          // resource loaded (window, img, etc.)
"DOMContentLoaded"  // HTML parsed, no waiting for CSS/img
"resize"
"scroll"
"beforeunload"  // user leaving page — set event.returnValue for prompt
"unload"        // deprecated for most uses
"visibilitychange" // document.visibilityState changed
"online" / "offline"

// Pointer (unified mouse + touch + stylus)
"pointerdown" / "pointerup" / "pointermove"
"pointerenter" / "pointerleave"
"pointercancel"

// Drag
"dragstart" / "drag" / "dragend"
"dragenter" / "dragover" / "dragleave" / "drop"

// Clipboard
"cut" / "copy" / "paste"

// Custom
el.dispatchEvent(new Event("my-event"))
el.dispatchEvent(new CustomEvent("my-event", { detail: { foo: "bar" }, bubbles: true }))
el.addEventListener("my-event", e => console.log(e.detail));

Event Delegation

// Attach one listener to parent instead of each child
document.querySelector("#list").addEventListener("click", (e) => {
  const item = e.target.closest("li");
  if (!item) return;
  console.log("Clicked:", item.dataset.id);
});
// Works for dynamically added children too

DOM Measurement

// Element size and position
const rect = el.getBoundingClientRect();
rect.top     // top from viewport
rect.left    // left from viewport
rect.width   // element width
rect.height  // element height
rect.right   // rect.left + rect.width
rect.bottom  // rect.top + rect.height

// Scroll
window.scrollY          // vertical scroll offset of window
window.scrollX          // horizontal scroll offset
el.scrollTop            // scroll offset within element
el.scrollLeft
el.scrollHeight         // total scrollable height
el.scrollWidth          // total scrollable width
el.clientHeight         // visible height (no scrollbar)
el.clientWidth          // visible width
el.offsetHeight         // height including border
el.offsetWidth
el.offsetTop            // top relative to offsetParent
el.offsetLeft

// Scroll actions
window.scrollTo({ top: 0, behavior: "smooth" })
el.scrollIntoView({ behavior: "smooth", block: "center" })
window.scrollBy({ top: 100, behavior: "smooth" })

DOM Manipulation Patterns

// Safe template rendering
function renderItem(item) {
  const li = document.createElement("li");
  li.textContent = item.name;      // safe — no XSS
  li.dataset.id = item.id;
  li.classList.add("item");
  if (item.active) li.classList.add("active");
  return li;
}

// Batch DOM updates with DocumentFragment
const frag = document.createDocumentFragment();
items.forEach(item => frag.appendChild(renderItem(item)));
list.appendChild(frag); // single reflow

// IntersectionObserver — lazy load / scroll spy
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.classList.add("visible");
      observer.unobserve(entry.target); // once only
    }
  });
}, { threshold: 0.1 });

document.querySelectorAll(".lazy").forEach(el => observer.observe(el));

// MutationObserver — watch DOM changes
const mo = new MutationObserver((mutations) => {
  mutations.forEach(m => console.log(m.type, m.addedNodes, m.removedNodes));
});
mo.observe(el, { childList: true, subtree: true, attributes: true });
mo.disconnect();

// ResizeObserver — element size changes
const ro = new ResizeObserver(entries => {
  entries.forEach(e => console.log(e.contentRect.width));
});
ro.observe(el);
ro.disconnect();

Forms

const form = document.querySelector("form");
const input = document.querySelector("input[name='email']");

// Values
input.value               // current value
input.defaultValue        // initial HTML value
input.checked             // checkbox/radio
input.files               // FileList for file inputs
new FormData(form)        // all form fields as FormData

// Validation
input.validity.valid      // boolean
input.validity.valueMissing
input.validity.typeMismatch
input.validity.patternMismatch
input.checkValidity()     // boolean
input.reportValidity()    // boolean + shows native UI
input.setCustomValidity("Error message") // "" to clear

form.addEventListener("submit", e => {
  e.preventDefault();
  const data = Object.fromEntries(new FormData(form));
  console.log(data);
});