How to Manipulate the DOM

DOM manipulation lets you create new elements, change existing ones, move things around, and remove them entirely, all from JavaScript.

I. Create an element

document.createElement(tagName) creates a new element in memory. It does not appear on the page until you insert it.

const li = document.createElement("li");

II. Set text content

Use .textContent to set plain text. Use .innerHTML only when you need to insert HTML markup, and only with trusted content.

const li = document.createElement("li");
li.textContent = "New item";

Avoid setting .innerHTML with user-provided content. It can introduce XSS vulnerabilities. Use .textContent for plain text.

III. Insert elements

append() and prepend()

append() inserts a node (or string) at the end of a parent’s children. prepend() inserts at the beginning.

<ul class="items">
  <li class="item">Item 1</li>
  <li class="item">Item 2</li>
</ul>
const ul = document.querySelector(".items");

const newLast = document.createElement("li");
newLast.textContent = "Item 3";
ul.append(newLast); // added at the end

const newFirst = document.createElement("li");
newFirst.textContent = "Item 0";
ul.prepend(newFirst); // added at the start

Result:

<ul class="items">
  <li>Item 0</li>
  <li class="item">Item 1</li>
  <li class="item">Item 2</li>
  <li>Item 3</li>
</ul>

appendChild() and insertBefore()

Older equivalents you will see in existing code:

ul.appendChild(newLast); // same as ul.append(newLast)

// insertBefore(newNode, referenceNode)
ul.insertBefore(newFirst, ul.firstElementChild);

Prefer append() and prepend() in new code. They accept multiple arguments and plain strings.

IV. Replace an element

const ul = document.querySelector(".items");

const replacement = document.createElement("li");
replacement.textContent = "Replaced item";

ul.replaceChild(replacement, ul.children[1]); // replaces Item 2

V. Remove an element

const ul = document.querySelector(".items");

ul.firstElementChild.remove(); // removes Item 1
ul.lastElementChild.remove();  // removes the last item
ul.remove();                   // removes the entire list

VI. Add inline styles

const div = document.querySelector("div");

div.style.backgroundColor = "blue";
div.style.border = "2px solid black";
div.style.width = "80px";
div.style.height = "50px";

CSS property names use camelCase in JavaScript (backgroundColor, not background-color).

VII. Working with classes

Prefer class manipulation over inline styles. It keeps styling in CSS where it belongs.

const div = document.querySelector("div");

div.classList.add("active");           // add a class
div.classList.remove("hidden");        // remove a class
div.classList.toggle("open");          // add if absent, remove if present
div.classList.contains("active");      // true/false
div.classList.replace("old", "new");   // swap a class